Get fullpath or convert to fullpath

后端 未结 2 997
情歌与酒
情歌与酒 2020-12-22 09:09

When using

let directoryEnumerator = FileManager().enumerator(at: ...

in Swift 3, I get all files from the folder, e.g.

\"f         


        
相关标签:
2条回答
  • 2020-12-22 09:50

    If "MacOS" is the name of your current startup disk then "/Volumes/MacOS" is a symbolic link to "/", so both "/fasttemp/Fotos/2005/" and "/Volumes/MacOS/fasttemp/Fotos/" are absolute paths to the same file.

    In order to get a unique file name representation you can query a URL for its canonical path. Example:

    let url = URL(fileURLWithPath: "/Volumes/MacOS/Applications/Utilities/")
    if let cp = (try? url.resourceValues(forKeys: [.canonicalPathKey]))?.canonicalPath {
        print(cp)
    }
    // Output: "/Applications/Utilities"
    

    This requires macOS 10.12/iOS 10 or later. On older systems you can use the realpath() system call:

    if let rp = url.withUnsafeFileSystemRepresentation ({ realpath($0, nil) }) {
        let fullUrl = URL(fileURLWithFileSystemRepresentation: rp, isDirectory: true, relativeTo: nil)
        free(rp)
        print(fullUrl.path)
    }
    // Output: "/Applications/Utilities"
    
    0 讨论(0)
  • 2020-12-22 09:53

    Note that you want to use URL wherever possible, from the NSURL documentation:

    URL objects are the preferred way to refer to local files. Most objects that read data from or write data to a file have methods that accept an NSURL object instead of a pathname as the file reference.

    Here’s an example of how to get all the objects from a directory:

    import Foundation
    
    let manager = FileManager.default
    
    // Get URL for the current user’s Documents directory
    // Use URL instead of path, it’s more flexible and preferred
    if let documents = manager.urls(for: .documentDirectory, in: .userDomainMask).first,
    
      // Get an Enumerator for the paths of all the objects in the directory
      // but do not descend into directories or packages
      let directoryEnumerator = manager.enumerator(at: documents, includingPropertiesForKeys: [URLResourceKey.pathKey], options: [.skipsSubdirectoryDescendants, .skipsPackageDescendants]) {
    
      // iterate through the objects (files, directories, etc.) in the directory
      for path in directoryEnumerator {
        print(path)
      }
    }
    
    0 讨论(0)
提交回复
热议问题