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


127

ডকুমেন্টস ডিরেক্টরিতে কোনও ফাইল উপস্থিত রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন Swift?

আমি [ .writeFilePath ]কোনও দস্তাবেজ ডিরেক্টরিতে কোনও চিত্র সংরক্ষণ করার জন্য পদ্ধতিটি ব্যবহার করছি এবং অ্যাপটি চালু হওয়ার সাথে সাথে আমি এটি লোড করতে চাই। কোনও সংরক্ষিত চিত্র না থাকলে আমার ডিফল্ট চিত্র রয়েছে image

তবে আমি কীভাবে [ func fileExistsAtPath(_:) ]ফাংশনটি ব্যবহার করতে পারি তার মাথা পেতে পারি না । কেউ যদি কোনও পথ আর্গুমেন্ট দিয়ে এতে ফাংশনটি ব্যবহারের উদাহরণ দিতে পারে।

আমি বিশ্বাস করি যে এখানে একটি কোড আটকানোর দরকার নেই কারণ এটি একটি সাধারণ প্রশ্ন। যে কোন সাহায্যের জন্য অনেক প্রশংসা করা হবে।

চিয়ার্স

উত্তর:


248

সুইফট 4.x সংস্করণ

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    if let pathComponent = url.appendingPathComponent("nameOfFileHere") {
        let filePath = pathComponent.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) {
            print("FILE AVAILABLE")
        } else {
            print("FILE NOT AVAILABLE")
        }
    } else {
        print("FILE PATH NOT AVAILABLE")
    }

সুইচ 3.x সংস্করণ

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = URL(fileURLWithPath: path)

    let filePath = url.appendingPathComponent("nameOfFileHere").path
    let fileManager = FileManager.default
    if fileManager.fileExists(atPath: filePath) {
        print("FILE AVAILABLE")
    } else {
        print("FILE NOT AVAILABLE")
    }

সুইফট ২.০ সংস্করণে ইউআরএলবাই অ্যাপেন্ডিংপ্যাথ কম্পোনেন্ট ব্যবহার করা দরকার

    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    let filePath = url.URLByAppendingPathComponent("nameOfFileHere").path!
    let fileManager = NSFileManager.defaultManager()
    if fileManager.fileExistsAtPath(filePath) {
        print("FILE AVAILABLE")
    } else {
        print("FILE NOT AVAILABLE")
    }

দেখে মনে হচ্ছে উত্তরটি আপডেট হয়েছে তাই পরম স্ট্রিং মন্তব্যগুলি অপ্রচলিত বলে মনে হচ্ছে।
এফরেন

সম্ভবত এই মন্তব্যগুলি ছিল যে পরম স্ট্রিং কোনও ইউআরএল থেকে কাজ করে না, তবে পথটি করে যা আমি খুঁজে পেয়েছি!
সিএম্যাশ

33

নীচের কোডটি পরীক্ষা করুন:

সুইফট ১.২

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

let getImagePath = paths.stringByAppendingPathComponent("SavedFile.jpg")

let checkValidation = NSFileManager.defaultManager()

if (checkValidation.fileExistsAtPath(getImagePath))
{
    println("FILE AVAILABLE");
}
else
{
    println("FILE NOT AVAILABLE");
}

সুইফট ২.০

let paths = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let getImagePath = paths.URLByAppendingPathComponent("SavedFile.jpg")

let checkValidation = NSFileManager.defaultManager()

if (checkValidation.fileExistsAtPath("\(getImagePath)"))
{
    print("FILE AVAILABLE");
}
else
{
    print("FILE NOT AVAILABLE");
}

3
@ সাকিব ওমর স্ট্রিংয়ের চেয়ে এনএসএসস্ট্রিং হিসাবে পাথ কাস্ট করার চেষ্টা করুন। var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
ভেড়াগব্বীপ

@ প্রিমকুমার কেন আজব স্ট্রিং ইন্টারপোলেশন? আপনি ব্যবহার করতে পারে absoluteStringরূপান্তর করতে NSURLকরতে pathকিন্তু এটা শুধু ভাল হবে একটি স্ট্রিং (যেমন পাথ রাখা NSString) মত আপনি সুইফট 1.2 না।
সুলতান

: আমি সুইফট 2 সঠিকভাবে কাজ করার জন্য এই উত্তর পাওয়া stackoverflow.com/a/36897617/1245231
petrsyn

27

আজকাল (2016) অ্যাপল এবং আরো আরো URL টি সংশ্লিষ্ট API- টি ব্যবহার করার বিশেষ পরামর্শ দেওয়া হচ্ছে NSURL, NSFileManagerইত্যাদি

IOS এবং নথি ডিরেক্টরির পেতে সুইফট 2 ব্যবহার

let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, 
                                 inDomain: .UserDomainMask, 
                        appropriateForURL: nil, 
                                   create: true)

try!কারণ এই মান ডিরেক্টরির অস্তিত্ব নিশ্চিত করা হয় এই ক্ষেত্রে নিরাপদ।

তারপরে একটি sqliteফাইলের জন্য উপযুক্ত পাথ উপাদান যুক্ত করুন

let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite")

যদি এখন চেক ফাইলের সাথে বিদ্যমান checkResourceIsReachableAndReturnErrorএর NSURL

let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil)

আপনার যদি ত্রুটির প্রয়োজন হয় তবে NSErrorপয়েন্টারটি প্যারামিটারে পাস করুন ।

var error : NSError?
let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error)
if !fileExists { print(error) }

সুইফট 3+:

let documentDirectoryURL = try! FileManager.default.url(for: .documentDirectory, 
                                in: .userDomainMask, 
                    appropriateFor: nil, 
                            create: true)

let databaseURL = documentDirectoryURL.appendingPathComponent("MyDataBase.sqlite")

checkResourceIsReachableহিসাবে চিহ্নিত আছে করতে পারেন নিক্ষেপ

do {
    let fileExists = try databaseURL.checkResourceIsReachable()
    // handle the boolean result
} catch let error as NSError {
    print(error)
}

কেবল বুলিয়ান রিটার্ন মান বিবেচনা করতে এবং ত্রুটি উপেক্ষা করার জন্য শূন্য-কোয়েলসিং অপারেটরটি ব্যবহার করুন

let fileExists = (try? databaseURL.checkResourceIsReachable()) ?? false

আমি সুইফ্ট 3 এ মনে করি এটি এখন checkResourceIsReachable()এবং কেবল টাইপের Boolজন্য ফিরে আসে URL
ইথান অ্যালেন

1
আমি যে সমস্যাটি পেয়েছি তা হ'ল আপনি সুইফট 3-এ চেকআরসোর্সআইআরসিচেবল () থেকে কোনও "মিথ্যা" মান পাবেন বলে মনে হয় না, ফাইলটি না থাকলে কেবল ব্যতিক্রম। আমি এমন একটি এপিআই ব্যবহার করে খুব খুশি নই যেখানে প্রচুর কলগুলি সাধারণ রিটার্ন মানের পরিবর্তে ব্যতিক্রম ঘটায়।
কেন্ডল হেলস্টেটার জেলনার

@ KendallHelmstetterGelner সুইফ্টের try - catchধরণটি ব্যতিক্রম ছুঁড়ে না। এটি উদ্দেশ্যমূলক-সি ব্যতিক্রমগুলির সাথে তুলনীয় নয়। এটি একটি দক্ষ ত্রুটি পরিচালনার সিস্টেম।
ভাদিয়ান

1
আমি জানি এটি আরও দক্ষ, তবে ধারণাগতভাবে আমি এটি পছন্দ করি না। আমি ব্যতিক্রম কিছু ছুঁড়ে মারতে আপত্তি করি না - একটি ব্যতিক্রম। তবে একটি ফাইল বিদ্যমান নেই এটি ব্যতিক্রম নয়। এটি একটি সাধারণ ক্ষেত্রে এবং ফলস্বরূপ একটি মিথ্যা রিটার্ন মান হওয়া উচিত, কোনও মোড়কযুক্ত ত্রুটিযুক্ত বস্তু যা তৈরি করতে হয়েছিল তা দিয়ে কোনও ধরণের বিচ্যুতি নয়। এটি খুব বেশি মনে হচ্ছে না তবে আপনার কাছে যদি হাজার হাজার ফাইল থাকে যাচাই করার জন্য ভারটি খুব বেশি।
কেন্ডাল হেলস্টেটার জেলনার

16

এটি বেশ ব্যবহারকারী বান্ধব। কেবল এনএসফাইলম্যানেজারের ডিফল্ট ম্যানেজার সিঙ্গেলটন নিয়ে কাজ করুন এবং তারপরে fileExistsAtPath()পদ্ধতিটি ব্যবহার করুন যা কেবল স্ট্রিংকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং একটি বুল ফিরিয়ে দেয়, যদি এটি সরাসরি বিবৃতিতে স্থাপন করতে দেয়।

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentDirectory = paths[0] as! String
let myFilePath = documentDirectory.stringByAppendingPathComponent("nameOfMyFile")

let manager = NSFileManager.defaultManager()
if (manager.fileExistsAtPath(myFilePath)) {
    // it's here!!
}

দ্রষ্টব্য যে স্ট্রিং-এ ডাউন কাস্টটি সুইফট 2-তে প্রয়োজনীয় নয়।


♦ দয়া করে এখানে আমাকে স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 31503283/… সহায়তা করুন । কোন কোডটি লেখার দরকার তা আমি জানি না।
আলেকজান্ডার খিতেভ

6

সুইফ্ট 3- এ বিকল্প / প্রস্তাবিত কোড প্যাটার্নটি হ'ল :

  1. ফাইলম্যানেজারের পরিবর্তে ইউআরএল ব্যবহার করুন
  2. ব্যতিক্রম হ্যান্ডলিংয়ের ব্যবহার

    func verifyIfSqliteDBExists(){
        let docsDir     : URL       = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let dbPath      : URL       = docsDir.appendingPathComponent("database.sqlite")
    
        do{
            let sqliteExists : Bool = try dbPath.checkResourceIsReachable()
            print("An sqlite database exists at this path :: \(dbPath.path)")
    
        }catch{
            print("SQLite NOT Found at :: \(strDBPath)")
        }
    }

5

সুইফট 4.2

extension URL    {
    func checkFileExist() -> Bool {
        let path = self.path
        if (FileManager.default.fileExists(atPath: path))   {
            print("FILE AVAILABLE")
            return true
        }else        {
            print("FILE NOT AVAILABLE")
            return false;
        }
    }
}

ব্যবহার: -

if fileUrl.checkFileExist()
   {
      // Do Something
   }

4

সুইফট 3 প্রারম্ভিকদের সুবিধার্থে :

  1. সুইফট 3 বেশিরভাগ নেক্সটস্টেপ সিনট্যাক্সটি সরিয়ে ফেলেছে
  2. সুতরাং এনএসআরএল, এনএসফাইলেম্যানেজার, এনএসএস সার্চপথফোর্ড ডিরেক্টরীআইএনডোমাইন আর ব্যবহার করা হয় না
  3. পরিবর্তে ইউআরএল এবং ফাইলম্যানেজার ব্যবহার করুন
  4. এনএসএস সার্চপথফোর্ড ডিরেক্টরিসমূহডমোইন প্রয়োজন হয় না
  5. পরিবর্তে FileManager.default.urls ব্যবহার করুন

অ্যাপ্লিকেশন ডকুমেন্ট ডিরেক্টরিতে "database.sqlite" নামের একটি ফাইল বিদ্যমান কিনা তা যাচাই করার জন্য এখানে একটি কোড নমুনা রয়েছে:

func findIfSqliteDBExists(){

    let docsDir     : URL       = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let dbPath      : URL       = docsDir.appendingPathComponent("database.sqlite")
    let strDBPath   : String    = dbPath.path
    let fileManager : FileManager   = FileManager.default

    if fileManager.fileExists(atPath:strDBPath){
        print("An sqlite database exists at this path :: \(strDBPath)")
    }else{
        print("SQLite NOT Found at :: \(strDBPath)")
    }

}

3

খুব সহজ: আপনার পথটি যদি কোনও URL উদাহরণ হয় তবে 'পাথ' পদ্ধতিতে স্ট্রিংয়ে রূপান্তর।

    let fileManager = FileManager.default
    var isDir: ObjCBool = false
    if fileManager.fileExists(atPath: yourURLPath.path, isDirectory: &isDir) {
        if isDir.boolValue {
            //it's a Directory path
        }else{
            //it's a File path
        }
    }

1

এটি আমার পক্ষে সুইফট 4 এ দুর্দান্ত কাজ করে:

func existingFile(fileName: String) -> Bool {

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    if let pathComponent = url.appendingPathComponent("\(fileName)") {
        let filePath = pathComponent.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) 

       {

        return true

        } else {

        return false

        }

    } else {

        return false

        }


}

আপনি এই কল দিয়ে পরীক্ষা করতে পারেন:

   if existingFile(fileName: "yourfilename") == true {

            // your code if file exists

           } else {

           // your code if file does not exist

           }

আমি আশা করি এটি কারওর জন্য দরকারী। @; -]


ব্যবহারকারী যদি কেবলমাত্র নথির ডিরেক্টরি পরীক্ষা করতে চান না তবে কী হবে? এবং জেনেরিক পাথ অনুসন্ধান করতে চান
জোগেন্দ্র কুমার

0

আপনাকে অবশ্যই ফাইল নামের আগে একটি "/" স্ল্যাশ যুক্ত করতে হবে, অথবা আপনি "... / ডকুমেন্টস ফাইল ফাইল.জেপজি" এর মতো পথ পান


0

সুইফট 4 উদাহরণ:

var filePath: String {
    //manager lets you examine contents of a files and folders in your app.
    let manager = FileManager.default

    //returns an array of urls from our documentDirectory and we take the first
    let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
    //print("this is the url path in the document directory \(String(describing: url))")

    //creates a new path component and creates a new file called "Data" where we store our data array
    return(url!.appendingPathComponent("Data").path)
}

আমি চেকটি আমার লোডডেটা ফাংশনে রেখেছি যা আমি ভিডিডলয়েডে কল করেছি।

override func viewDidLoad() {
    super.viewDidLoad()

    loadData()
}

তারপরে আমি নীচে লোডডাটা সংজ্ঞায়িত করেছি।

func loadData() {
    let manager = FileManager.default

    if manager.fileExists(atPath: filePath) {
        print("The file exists!")

        //Do what you need with the file. 
        ourData = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as! Array<DataObject>         
    } else {
        print("The file DOES NOT exist! Mournful trumpets sound...")
    }
}

0

সুইফট 5 এ কাজ করে

    do {
        let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        let fileUrl = documentDirectory.appendingPathComponent("userInfo").appendingPathExtension("sqlite3")
        if FileManager.default.fileExists(atPath: fileUrl.path) {
            print("FILE AVAILABLE")
        } else {
            print("FILE NOT AVAILABLE")
        }
    } catch {
        print(error)
    }

যেখানে "userInfo"- ফাইলের নাম এবং "sqlite3"- ফাইলের এক্সটেনশন

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