fileExistsAtPath不适用于localhost URL

时间:2017-04-16 09:46:21

标签: ios objective-c xcode url

我有一个位于Mac的WebServer文件夹中的URL文件。

当我想用我的localhost(http://192.168.1.95)读取这样的文件时,它可以工作:

NSURL *numberOfAccounts = [NSURL URLWithString:@"http://192.168.1.95/NumberOfAccounts"];
NSString *text = [NSString stringWithContentsOfURL:numberOfAccounts encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",text); // it works

但是当我想检查文件是否存在时,总会返回NO

BOOL isDir;
if ([[NSFileManager defaultManager] fileExistsAtPath:numberOfAccounts.path isDirectory:&isDir]) {
NSLog(@"Yes"); // never call

我尝试使用.path.absoluteString,使用直接NSString @"http://192.168.1.95/NumberOfAccounts",使用函数fileURLWithPath,但它不起作用,我不明白,因为NSLog中的路径与我想要读取文件时的路径相同。

此外,当我想列出文件夹的包含时,我认为我有相同的路径问题,因为我的NSSMutableArray是空的:

NSMutableArray *allFiles = [[NSMutableArray alloc] initWithArray:[[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSURL URLWithString:@"http://192.168.1.95"] includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]];

提前谢谢。

2 个答案:

答案 0 :(得分:1)

fileExistsAtPath仅适用于本地文件系统路径(file://方案,从/开始),这也是没有fileExistsAtURL方法的原因。

答案 1 :(得分:0)

您需要了解文件网址与所有其他类型网址之间的区别。

例如,HTTP是用于与另一个程序,服务器通信的协议。您从中获得的响应可能是动态的。也就是说,服务器可以执行 任何 程序可以响应您的请求。即使它成功地为您提供数据,也不意味着任何特定的"文件" "存在&#34 ;.服务器可能已从头开始生成数据或从其他数据合成数据。

一般情况下,无法检查服务器是否会成功为特定请求提供数据,而不是通过询问。

出于这个原因,有许多方法NSURL或其他类的方法接受NSURL作为参数,这些方法仅适用于本地file:网址,不适用于其他类型的网址。

网址字符串(例如absoluteString属性)永远是有效的文件路径,即使对于文件网址也是如此。

对于您的特定网址,numberOfAccounts.path@"/NumberOfAccounts"相同。也就是说,它是URL的路径部分。不包括重要信息,例如需要使用HTTP来访问它的事实以及提供它的主机。如果您尝试在该路径上执行文件操作,它将尝试访问名为" NumberOfAccounts"在本地计算机的文件系统的根目录下。它不太可能存在这样的文件,即使存在,也与通过URL访问的文件不同。

与您的其他误解一样,您将http://192.168.1.95视为http://192.168.1.95/NumberOfAccounts的父目录的尝试感到困惑。它不是任何类型的目录。它只是一个主持人和一个计划。该主机的HTTP服务器可能提供 HTML文档,显示文件列表(例如,如果您要在Web浏览器中访问该URL),但HTML文档不是目录。

您可以尝试通过执行HEAD请求来检查服务器是否会为特定请求提供数据。这是一些应该运行的未经测试的代码:

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:numberOfAccounts];
request.HTTPMethod = @"HEAD";
NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSHTTPURLResponse *response, NSError *error){
    if (response.statusCode == 200)
    {
        // success
    }
    else
    {
        // failure
    }
}];
[task resume];

请注意,上述内容是异步的。代码执行后,答案不会立即被告知。相反,一旦与服务器的通信完成,完成处理程序将在稍后运行。你必须构建自己的代码来应对这一点。