दस्तावेज़ फ़ोल्डर में फ़ाइलों की सूची प्राप्त करना


124

दस्तावेज़ फ़ोल्डर में फ़ाइल नाम प्राप्त करने के लिए मेरे कोड में क्या गलत है?

func listFilesFromDocumentsFolder() -> [NSString]?{
    var theError = NSErrorPointer()
    let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
    if dirs != nil {
        let dir = dirs![0] as NSString
        let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir, error: theError) as [NSString]
        return fileList
    }else{
        return nil
    }
}

मैंने सोचा था कि मैं दस्तावेजों को सही ढंग से पढ़ता हूं और मुझे बहुत यकीन है कि दस्तावेज़ फ़ोल्डर में क्या है, लेकिन "फाइललिस्ट" कुछ भी नहीं दिखाता है? "dir" फ़ोल्डर को पथ दिखाता है।


आप उन फ़ाइलों के नाम दिखाना चाहते हैं जो दस्तावेज़ निर्देशिका में हैं या वे फ़ाइलें जो फ़ोल्डर्स में भी हैं?
आदिल उर रहमान

सबसे पहले, केवल दस्तावेज़ फ़ोल्डर में फ़ाइलें!
पावी

मैंने सिर्फ आपका कोड चलाया और यह उम्मीद के मुताबिक काम किया। मुझे अपने दस्तावेज़ निर्देशिका में क्या है की एक सूची मिली। क्या हम आपके प्रश्न को गलत समझते हैं?
jwlaughton

अजीब? मैंने भी ".fileExistsAtPath (पथ)" का उपयोग किया था जो मुझे बताता है कि एक विशिष्ट फ़ाइल मौजूद है। लेकिन "फाइललिस्ट" में कुछ भी नहीं दिखा !?
पाव

मेरी सूची में निर्देशिका और फाइलें दोनों शामिल हैं।
jwlaughton

जवाबों:


111

यह समाधान स्विफ्ट 4 (Xcode 9.2) और स्विफ्ट 5 (Xcode 10.2.1+) के साथ भी काम करता है :

let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
do {
    let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
    // process files
} catch {
    print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)")
}

यहाँ एक पुन: प्रयोज्य FileManager एक्सटेंशन है जो आपको परिणामों में छिपी हुई फ़ाइलों को छोड़ या शामिल करने देता है:

import Foundation

extension FileManager {
    func urls(for directory: FileManager.SearchPathDirectory, skipsHiddenFiles: Bool = true ) -> [URL]? {
        let documentsURL = urls(for: directory, in: .userDomainMask)[0]
        let fileURLs = try? contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil, options: skipsHiddenFiles ? .skipsHiddenFiles : [] )
        return fileURLs
    }
}

// Usage
print(FileManager.default.urls(for: .documentDirectory) ?? "none")

मैं छिपी हुई फ़ाइलों को कैसे बाहर कर सकता हूं?
बेस्डमुसा

251

स्विफ्ट 5

// Get the document directory url
let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

do {
    // Get the directory contents urls (including subfolders urls)
    let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil)
    print(directoryContents)

    // if you want to filter the directory contents you can do like this:
    let mp3Files = directoryContents.filter{ $0.pathExtension == "mp3" }
    print("mp3 urls:",mp3Files)
    let mp3FileNames = mp3Files.map{ $0.deletingPathExtension().lastPathComponent }
    print("mp3 list:", mp3FileNames)

} catch {
    print(error)
}

1
ऐसे लोगों के लिए जो मैं जितना लापरवाह हूं। ध्यान दें कि कॉल: FileManager.default.contentsOfDirectory (atPath: <# T ## स्ट्रिंग #>) स्विफ्ट 3.0 में अज्ञात कारणों से ठीक से काम नहीं कर सकता है। यहाँ ऊपर दिए गए एक का उपयोग करें।
माइकल शांग

यदि मैं इसे iCloud ड्राइव निर्देशिका पर चलाता हूं, तो यह केवल उन आइटमों को लौटाता है जिन्हें डिवाइस पर डाउनलोड किया गया है - क्या सभी आइटमों के URL को पहले डाउनलोड किए बिना प्राप्त करने का कोई तरीका है?
म्लेच्छाय

@mralexhay यह मेरे लिए यह दिखाता है कि जो आइटम डाउनलोड नहीं हुए हैं। यह फ़ाइल नाम में एक डॉट .उपसर्ग और एक .cloudप्रत्यय दिखाना चाहिए । कोशिश let icloudFiles = directoryContents.filter{ $0.pathExtension == "icloud" }करें कि यह उन फ़ाइलों को दिखाए जो डाउनलोड नहीं हुई हैं
लियो डबस

1
उत्तर के लिए @LeoDabus धन्यवाद - मुझे यह महसूस नहीं हुआ था कि यह "प्रीपेंड" है। मुझे लगा कि इसमें सिर्फ "आईक्लाउड" प्रत्यय था। मुझे एहसास हुआ कि मैं छिपी हुई फाइलें नहीं लौटा रहा था - कोई आश्चर्य नहीं कि वे नहीं दिखाए गए थे! एक बार फिर धन्यवाद।
मृलक्षय 19

17

SWIFT 3 के लिए एक छोटा सिंटैक्स

func listFilesFromDocumentsFolder() -> [String]?
{
    let fileMngr = FileManager.default;

    // Full path to documents directory
    let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path

    // List all contents of directory and return as [String] OR nil if failed
    return try? fileMngr.contentsOfDirectory(atPath:docs)
}

उपयोग उदाहरण:

override func viewDidLoad()
{
    print(listFilesFromDocumentsFolder())
}

IOS 10.2 के साथ iPhone 7 के लिए XCode 8.2.3 पर परीक्षण किया गया और iOS 9.3 के साथ iPad


6

Apple के बारे में बताता है NSSearchPathForDirectoriesInDomains(_:_:_:):

आपको FileManagerतरीकों का उपयोग करने पर विचार करना चाहिए urls(for:in:)और url(for:in:appropriateFor:create:)कौन से URL को वापस करना चाहिए, जो पसंदीदा प्रारूप हैं।


स्विफ्ट 5 के साथ, FileManagerएक विधि कहा जाता है contentsOfDirectory(at:includingPropertiesForKeys:options:)contentsOfDirectory(at:includingPropertiesForKeys:options:)निम्नलिखित घोषणा है:

निर्दिष्ट निर्देशिका की उथली खोज करता है और निहित मदों के लिए URL लौटाता है।

func contentsOfDirectory(at url: URL, includingPropertiesForKeys keys: [URLResourceKey]?, options mask: FileManager.DirectoryEnumerationOptions = []) throws -> [URL]

इसलिए, दस्तावेज़ निर्देशिका में निहित फ़ाइलों के यूआरएल को पुनः प्राप्त करने के लिए, आप निम्न कोड स्निपेट का उपयोग कर सकते हैं जो FileManager's urls(for:in:)और contentsOfDirectory(at:includingPropertiesForKeys:options:)विधियों का उपयोग करता है :

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

do {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: [])

    // Print the urls of the files contained in the documents directory
    print(directoryContents)
} catch {
    print("Could not search for urls of files in documents directory: \(error)")
}

एक उदाहरण के रूप में, UIViewControllerनीचे दिए गए कार्यान्वयन से पता चलता है कि किसी फ़ाइल को ऐप बंडल से दस्तावेज़ निर्देशिका में कैसे बचाया जाए और दस्तावेज़ निर्देशिका में सहेजी गई फ़ाइलों के url कैसे प्राप्त करें:

import UIKit

class ViewController: UIViewController {

    @IBAction func copyFile(_ sender: UIButton) {
        // Get file url
        guard let fileUrl = Bundle.main.url(forResource: "Movie", withExtension: "mov") else { return }

        // Create a destination url in document directory for file
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        let documentDirectoryFileUrl = documentsDirectory.appendingPathComponent("Movie.mov")

        // Copy file to document directory
        if !FileManager.default.fileExists(atPath: documentDirectoryFileUrl.path) {
            do {
                try FileManager.default.copyItem(at: fileUrl, to: documentDirectoryFileUrl)
                print("Copy item succeeded")
            } catch {
                print("Could not copy file: \(error)")
            }
        }
    }

    @IBAction func displayUrls(_ sender: UIButton) {
        guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }

        do {
            let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: [])

            // Print the urls of the files contained in the documents directory
            print(directoryContents) // may print [] or [file:///private/var/mobile/Containers/Data/Application/.../Documents/Movie.mov]
        } catch {
            print("Could not search for urls of files in documents directory: \(error)")
        }
    }

}

5

यह कोड मेरे दस्तावेज़ निर्देशिका में सभी निर्देशिकाओं और फ़ाइलों को प्रिंट करता है:

आपके फ़ंक्शन का कुछ संशोधन:

func listFilesFromDocumentsFolder() -> [String]
{
    let dirs = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true)
    if dirs != [] {
        let dir = dirs[0]
        let fileList = try! FileManager.default.contentsOfDirectory(atPath: dir)
        return fileList
    }else{
        let fileList = [""]
        return fileList
    }
}

जिसे कहा जाता है:

    let fileManager:FileManager = FileManager.default
    let fileList = listFilesFromDocumentsFolder()

    let count = fileList.count

    for i in 0..<count
    {
        if fileManager.fileExists(atPath: fileList[i]) != true
        {
            print("File is \(fileList[i])")
        }
    }

4

स्विफ्ट 2.0 कम्पैटिबिलिटी

func listWithFilter () {

    let fileManager = NSFileManager.defaultManager()
           // We need just to get the documents folder url
    let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL

    do {
    // if you want to filter the directory contents you can do like this:
    if let directoryUrls = try? NSFileManager.defaultManager().contentsOfDirectoryAtURL(documentsUrl, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsSubdirectoryDescendants) {
        print(directoryUrls)
       ........
        }

    }

}

या

 func listFiles() -> [String] {

    var theError = NSErrorPointer()
    let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
    if dirs != nil {
        let dir = dirs![0]
        do {
        let fileList = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir)
        return fileList as [String]
        }catch {

        }

    }else{
        let fileList = [""]
        return fileList
    }
    let fileList = [""]
    return fileList

}

0

सरल और गतिशील समाधान (स्विफ्ट 5):

extension FileManager {

  class func directoryUrl() -> URL? {
      let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
      return paths.first
  }

  class func allRecordedData() -> [URL]? {
     if let documentsUrl = FileManager.directoryUrl() {
        do {
            let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil)
            return directoryContents.filter{ $0.pathExtension == "m4a" }
        } catch {
            return nil
        }
     }
     return nil
  }}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.