我有一个位于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]];
提前谢谢。
答案 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];
请注意,上述内容是异步的。代码执行后,答案不会立即被告知。相反,一旦与服务器的通信完成,完成处理程序将在稍后运行。你必须构建自己的代码来应对这一点。