নথি ফোল্ডারে ফাইলের তালিকা পাওয়া Get


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
    }
}

আমি ভেবেছিলাম আমি নথিগুলি সঠিকভাবে পড়েছি এবং নথি ফোল্ডারে কী রয়েছে সে সম্পর্কে আমি খুব নিশ্চিত, তবে "ফাইললিস্ট" কিছুই দেখায় না? "দির" ফোল্ডারের পথ দেখায়।


আপনি ডকুমেন্ট ডিরেক্টরিতে থাকা ফাইলগুলির ফাইলগুলি বা ফোল্ডারে থাকা ফাইলগুলির নামও প্রদর্শন করতে চান?
আদিল উর রেহমান

প্রথমত, ডকুমেন্ট ফোল্ডারে নিজেই কেবল ফাইলগুলি!
পাবি

আমি কেবল আপনার কোডটি চালিয়েছি এবং এটি প্রত্যাশা অনুযায়ী কাজ করেছে। আমার নথির ডিরেক্টরিতে যা আছে তার একটি তালিকা পেয়েছি। আমরা কি আপনার প্রশ্নকে ভুল বুঝি?
jwlaughton

স্ট্রেঞ্জ? আমি ".fileExistsAtPath (path)" ব্যবহার করেছি যা আমাকে বলে যে একটি নির্দিষ্ট ফাইল উপস্থিত রয়েছে is তবে "ফাইললিস্ট" তে কিছুই দেখা যাচ্ছে না ??
পাবি

আমার তালিকায় ডিরেক্টরি এবং ফাইল উভয়ই অন্তর্ভুক্ত ছিল।
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)")
}

এখানে পুনরায় ব্যবহারযোগ্য ফাইল ম্যানেজার এক্সটেনশান যা আপনাকে ফলাফলগুলিতে লুকানো ফাইলগুলি এড়িয়ে বা অন্তর্ভুক্ত করতে দেয়:

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
আমার মতো অসতর্ক লোকদের জন্য। দ্রষ্টব্য: কলটি: ফাইলম্যানেজআরডিফল্টকন্টেন্টসফট ডিরেক্টরি (এপথ: <# টি ## স্ট্রিং #>) অজানা কারণে সুইফট ৩.০ এ সঠিকভাবে কাজ করতে পারে না। উপরে বর্ণিত একটি ব্যবহার করুন।
মাইকেল শ্যাং

যদি আমি এটি আইক্লাউড ড্রাইভ ডিরেক্টরিতে চালিত করি তবে এটি কেবলমাত্র আইটেমগুলিতে ডাউনলোড করা আইটেমগুলি ফিরিয়ে দেয় - সমস্ত আইটেমের ইউআরএলগুলি প্রথমে ডাউনলোড না করে পাওয়ার উপায় আছে কি?
মরালক্ষয়

@ মৃলাকাহে এটি আমার জন্য এমনকি যে আইটেমগুলি ডাউনলোড করা হয়নি তা এটি দেখায়। এটি ফাইলের নামে একটি ডট .উপসর্গ এবং একটি .cloudপ্রত্যয় প্রদর্শন করা উচিত । চেষ্টা করুন let icloudFiles = directoryContents.filter{ $0.pathExtension == "icloud" }এটি ডাউনলোড করা হয়নি এমন ফাইলগুলি দেখানো উচিত
লিও ডাবাস

1
@ লিওডাবাস জবাবের জন্য ধন্যবাদ - আমি বুঝতে পারি নি যে এটি "" প্রতিরোধ করে। ", আমি ভেবেছিলাম এটিতে কেবল" আইক্লাউড "প্রত্যয় ছিল। আমি বুঝতে পেরেছি যে আমি লুকানো ফাইলগুলি ফিরছি না - এতে তারা আশ্চর্যের কিছু নেই! আবার ধন্যবাদ.
ম্রলাক্ষে

17

সুইফট 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())
}

আইওএস 10.2 এবং আইওএস 9.3 সহ আইফোন 7 এর জন্য এক্সকোড 8.2.3 এ পরীক্ষিত


6

অ্যাপল সম্পর্কে বলেছেন NSSearchPathForDirectoriesInDomains(_:_:_:):

আপনার FileManagerপদ্ধতিগুলি ব্যবহার করে urls(for:in:)এবং url(for:in:appropriateFor:create:)কোনটি ইউআরএল ফেরত দেয় সেগুলি বিবেচনা করা উচিত , যা পছন্দসই বিন্যাস।


সুইফট 5 এর সাথে FileManagerএকটি পদ্ধতি বলা হয় contentsOfDirectory(at:includingPropertiesForKeys:options:)contentsOfDirectory(at:includingPropertiesForKeys:options:)নিম্নলিখিত ঘোষণা আছে:

নির্দিষ্ট ডিরেক্টরিটির অগভীর অনুসন্ধান সম্পাদন করে এবং অন্তর্ভুক্ত আইটেমগুলির জন্য URL গুলি দেয় returns

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

সুতরাং, ডকুমেন্ট ডিরেক্টরিতে থাকা ফাইলগুলির ইউআরএলগুলি পুনরুদ্ধার করার জন্য, আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন যা FileManagerএর 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নীচের বাস্তবায়নটি দেখায় যে অ্যাপ্লিকেশন বান্ডেল থেকে নথি ডিরেক্টরিতে কোনও ফাইল কীভাবে সংরক্ষণ করতে হয় এবং কীভাবে ফাইলগুলির ইউআরএলগুলি ডকুমেন্ট ডিরেক্টরিতে সংরক্ষণ করা যায়:

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

সুইফট ২.০ সামর্থ্য

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
  }}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.