【问题标题】:Mac OS: how to determine path is file or directoryMac OS:如何确定路径是文件还是目录
【发布时间】:2013-09-02 01:18:11
【问题描述】:

我有一个路径,我想知道,是这个目录还是一个文件。很简单,但我有一个问题。这是我的路径:

NSString *file = @"file://localhost/Users/myUser/myFolder/TestFolder/";

NSString *file = @"file://localhost/Users/myUser/myFolder/my_test_file.png";

这是我的代码:

BOOL isDir;


// the original code from apple documentation: 
// if ([fileManager fileExistsAtPath:file isDirectory:&isDir] && isDir)
// but even my if returns me "not ok" in log

if([[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDir])
{

     NSLog(@"directory");
}
else
{
     NSLog(@"not ok");
}

此路径上的文件和目录是存在的,它们没问题。但我认为问题可能出在其中。但我不知道为什么。请帮帮我。

顺便说一下,我从另一种方法获得路径:

   NSArray *contentOfMyFolder = [[NSFileManager defaultManager]
                contentsOfDirectoryAtURL:urlFromBookmark
              includingPropertiesForKeys:@[NSURLContentModificationDateKey, NSURLLocalizedNameKey]
                                 options:NSDirectoryEnumerationSkipsHiddenFiles
                                   error:nil];

在 for 循环之后,我得到存储在数组 contentOfMyFolder 中的项目 并得到这样的路径:

 for (id item in contentOfMyFolder) {
     NSString *path = [item absoluteString]; 
 }

我认为这是方法 fileExistsAtPath:(NSString *)path isDirectory:(BOOL)isDir 的完全有效路径

问题可能隐藏在哪里?!

【问题讨论】:

    标签: objective-c macos file filesystems nsfilemanager


    【解决方案1】:

    问题出在这里:

    NSString *path = [item absoluteString];
    

    因为这会创建 URL 的字符串表示形式,例如

    file://localhost/Users/myUser/myFolder/TestFolder/
    

    这不是fileExistsAtPath: 所期望的。 您需要的是 path 方法将 URL 转换为路径:

    for (NSURL *item in contentOfMyFolder) {
        NSString *path = [item path];
        BOOL isDir;
        if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) {
            if (isDir) {
                NSLog(@"%@ is a directory", path);
            } else {
                NSLog(@"%@ is a file", path);
            }
        } else {
            NSLog(@"Oops, %@ does not exist?", path);
        }
    }
    

    或者,您可以向 URL 询问其“目录属性”:

    for (NSURL *item in contentOfMyFolder) {
        NSNumber *isDir;
        NSError *error;
        if ([item getResourceValue:&isDir forKey:NSURLIsDirectoryKey error:&error]) {
            if ([isDir boolValue]) {
                NSLog(@"%@ is a directory", item);
            } else {
                NSLog(@"%@ is a file", item);
            }
        } else {
            NSLog(@"error: %@", error);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2018-12-18
      • 2010-09-13
      • 2012-01-15
      • 2011-12-26
      • 2013-08-14
      • 2013-03-15
      相关资源
      最近更新 更多