दस्तावेज़ निर्देशिका से निर्दिष्ट फ़ाइल हटाएं


111

मैं अपने एप्लिकेशन दस्तावेज़ निर्देशिका से एक छवि हटाना चाहता हूं। छवि को हटाने के लिए कोड मैंने लिखा है:

 -(void)removeImage:(NSString *)fileName
{
    fileManager = [NSFileManager defaultManager];
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsPath = [paths objectAtIndex:0];
    filePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", fileName]];
    [fileManager removeItemAtPath:filePath error:NULL];
    UIAlertView *removeSuccessFulAlert=[[UIAlertView alloc]initWithTitle:@"Congratulation:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
    [removeSuccessFulAlert show];
}

आंशिक रूप से इसका काम कर रहा है। यह कोड निर्देशिका से फ़ाइल को हटा रहा है, लेकिन जब मैं निर्देशिका में सामग्री के लिए जाँच कर रहा हूं, तब भी यह छवि नाम दिखा रहा है। मैं निर्देशिका से पूरी तरह से उस फ़ाइल को निकालना चाहता हूं। मुझे वही करने के लिए कोड में क्या बदलना चाहिए? धन्यवाद


4
यह संभवतः एक त्रुटि है जिसे आपने नजरअंदाज कर दिया है, NSError उदाहरण जोड़ें और इसे हटाने के बाद जांचें। ItAemAtPath
दिमित्री शेवचेंको

1
उपयोग - (BOOL) fileExistsAtPath: (NSString *) पथ; यह जाँचने के लिए कि क्या छवि मौजूद है, यदि यह हाँ लौटाता है, तो इसका मतलब है कि आपका
निष्कासन

बस इसका परीक्षण किया है और यह निश्चित रूप से हटाया जा रहा है और हटाने में परिलक्षित होता है contentsOfDirectoryAtPath(यानी यहां कोई निर्देशिका कैशिंग शामिल नहीं है)। तो आपके पास खेलने में कुछ सरल त्रुटि होनी चाहिए जो NSErrorसामग्री को देखते समय स्पष्ट हो जाना चाहिए ।
रोब

जवाबों:


238

मैंने आपका कोड चेक किया। यह मेरे लिए काम कर रहा है। नीचे दिए गए संशोधित कोड का उपयोग करके किसी भी त्रुटि की जांच करें

- (void)removeImage:(NSString *)filename
{
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

  NSString *filePath = [documentsPath stringByAppendingPathComponent:filename];
  NSError *error;
  BOOL success = [fileManager removeItemAtPath:filePath error:&error];
  if (success) {
      UIAlertView *removedSuccessFullyAlert = [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"Successfully removed" delegate:self cancelButtonTitle:@"Close" otherButtonTitles:nil];
      [removedSuccessFullyAlert show];
  }
  else
  {
      NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);
  }
}

मैं दस्तावेज़ निर्देशिका में फ़ाइल बना सकता हूं, लेकिन इसे निकालने का प्रयास करते समय हमेशा त्रुटि मिलती है। आपके पास कोई विचार है?
वादिम

मैंने इसे हल किया। समस्या यह थी: मैंने बिना किसी विशेषता के नई फ़ाइल बनाई, और जैसा कि मैं समझता हूं, इसने एक डिफ़ॉल्ट विशेषता NSFileImmutable YES दिया। या कुछ इस तरह का। क्षमा करें, अब स्रोत नहीं दिखा सकते हैं। लेकिन समस्या तुच्छ थी।
वादिम

क्या जाँच फ़ाइल मौजूद है या आवश्यक नहीं है?
संग्राम शिवंकर

यह निर्देशिका से फ़ाइल हटाता है, लेकिन यह अभी भी सिम्युलेटर की तस्वीरों में छवि दिखा रहा है
सागर कोयानी

55

स्विफ्ट 3.0:

func removeImage(itemName:String, fileExtension: String) {
  let fileManager = FileManager.default
  let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
  let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
  let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
  guard let dirPath = paths.first else {
      return
  }  
  let filePath = "\(dirPath)/\(itemName).\(fileExtension)"
  do {
    try fileManager.removeItem(atPath: filePath)
  } catch let error as NSError {
    print(error.debugDescription)
  }}

@ अनिल वर्गीज की बदौलत, मैंने स्विफ्ट 2.0 में बहुत ही बेहतरीन कोड लिखा है:

static func removeImage(itemName:String, fileExtension: String) {
  let fileManager = NSFileManager.defaultManager()
  let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
  let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
  let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
  guard let dirPath = paths.first else {
    return
  }
  let filePath = "\(dirPath)/\(itemName).\(fileExtension)"
  do {
    try fileManager.removeItemAtPath(filePath)
  } catch let error as NSError {
    print(error.debugDescription)
  }
}

फ़ंक्शन को स्थिर क्यों बनाते हैं?
कैलजोन सेप

यह आप पर निर्भर करता है। यह आवश्यक नहीं है
रोमन बार्ज़िकज़क

क्या यह जांचने का कोई तरीका है कि फ़ाइल अभी भी मौजूद है / फ़ंक्शन को कॉल करने से पहले यह सुनिश्चित करने के लिए कि यह हटा दिया गया है?
ल्यूक

1
हां सुनिश्चित करें: fileManager = FileManager.default यदि fileManager.fileExists (atPath, filePath?) {प्रिंट ("फ़ाइल उपलब्ध")} बाकी {प्रिंट ("फ़ाइल उपलब्ध नहीं है")}
रोमन Barzyczak

11

स्विफ्ट 2.0:

func removeOldFileIfExist() {
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    if paths.count > 0 {
        let dirPath = paths[0]
        let fileName = "someFileName"
        let filePath = NSString(format:"%@/%@.png", dirPath, fileName) as String
        if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
            do {
                try NSFileManager.defaultManager().removeItemAtPath(filePath)
                print("old image has been removed")
            } catch {
                print("an error during a removing")
            }
        }
    }
}

8

स्विफ्ट में 3 और 4 दोनों

 func removeImageLocalPath(localPathName:String) {
            let filemanager = FileManager.default
            let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as NSString
            let destinationPath = documentsPath.appendingPathComponent(localPathName)
 do {
        try filemanager.removeItem(atPath: destinationPath)
        print("Local path removed successfully")
    } catch let error as NSError {
        print("------Error",error.debugDescription)
    }
    }

या यह विधि सभी स्थानीय फ़ाइल को हटा सकती है

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

2
प्रत्यक्ष कोशिश के बजाय अंतिम पंक्ति में निम्नलिखित जोड़ें। do {try filemanager.removeItem (atPath: डेस्टपैथ) प्रिंट ("हटा दिया गया")} पकड़ {प्रिंट ("नहीं हटाई गई")}
अभिराजसिंह ठाकोर

5

त्रुटि को NULL पर सेट करने के बजाय, इसे सेट करें

NSError *error;
[fileManager removeItemAtPath:filePath error:&error];
if (error){
NSLog(@"%@", error);
}

यह आपको बताएगा कि क्या यह वास्तव में फाइल को डिलीट कर रहा है


3

मैं दस्तावेज़ निर्देशिका से अपने sqlite db को हटाना चाहता हूं। मैंने नीचे दिए गए उत्तर द्वारा सफलतापूर्वक sqlite db को हटा दिया

NSString *strFileName = @"sqlite";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
NSEnumerator *enumerator = [contents objectEnumerator];
NSString *filename;
while ((filename = [enumerator nextObject])) {
    NSLog(@"The file name is - %@",[filename pathExtension]);
    if ([[filename pathExtension] isEqualToString:strFileName]) {
       [fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];
        NSLog(@"The sqlite is deleted successfully");
    }
}


1

FreeGor संस्करण स्विफ्ट 3.0 में परिवर्तित हो गया

 func removeOldFileIfExist() {
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    if paths.count > 0 {
        let dirPath = paths[0]
        let fileName = "filename.jpg"
        let filePath = NSString(format:"%@/%@", dirPath, fileName) as String
        if FileManager.default.fileExists(atPath: filePath) {
            do {
                try FileManager.default.removeItem(atPath: filePath)
                print("User photo has been removed")
            } catch {
                print("an error during a removing")
            }
        }
    }
}

0

आप NSFileManager.defaultManager () .DeletableFileAtPath (PathName) के साथ अपनी फ़ाइल हटाने की दोहरी सुरक्षा कर सकते हैं। अब तक आप पुराने त्रुटि तरीकों के रूप में {} कैच {} का उपयोग करते हैं, क्योंकि ये लंबे समय तक काम करते हैं। isDletableFileAtPath () एक "फेंकता" नहीं है (यानी "सार्वजनिक कवक हटाने ItItemAtPath (पथ: स्ट्रिंग) फेंकता है") इसलिए इसे करने की आवश्यकता नहीं है ... पकड़

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


                do {
                  try killFile.removeItemAtPath(arrayDictionaryFilePath)
                }
                catch let error as NSError {
                    error.description
                }
            }

0

यदि आप आधुनिक एपीआई तरीके से दिलचस्प हैं, तो हटाने से पहले, दस्तावेज़ निर्देशिका में NSSearchPath और फ़िल्टर फ़ाइलों से बचें, आप निम्न कार्य कर सकते हैं:

let fileManager = FileManager.default
let keys: [URLResourceKey] = [.nameKey, .isDirectoryKey]
let options: FileManager.DirectoryEnumerationOptions = [.skipsHiddenFiles, .skipsPackageDescendants]
guard let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).last,
      let fileEnumerator = fileManager.enumerator(at: documentsUrl,
                                                  includingPropertiesForKeys: keys,
                                                  options: options) else { return }

let urls: [URL] = fileEnumerator.flatMap { $0 as? URL }
                                .filter { $0.pathExtension == "exe" }
for url in urls {
   do {
      try fileManager.removeItem(at: url)
   } catch {
      assertionFailure("\(error)")
   }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.