Belirtilen dosyayı belge dizininden sil


111

Uygulama belge dizinimden bir görüntüyü silmek istiyorum. Görüntüyü silmek için yazdığım kod:

 -(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];
}

Kısmen çalışıyor. Bu kod, dosyayı dizinden siliyor, ancak dizindeki içeriği kontrol ettiğimde, orada hala görüntü adını gösteriyor. Bu dosyayı dizinden tamamen kaldırmak istiyorum. Aynısını yapmak için kodda neyi değiştirmeliyim? Teşekkürler


4
Büyük olasılıkla görmezden geldiğiniz bir hata atıyor, NSError örneği ekleyin ve removeItemAtPath'den sonra kontrol edin
Dmitry Shevchenko

1
use - (BOOL) fileExistsAtPath: (NSString *) yol; görüntünün var olup olmadığını kontrol etmek için EVET döndürürse, kaldırma işleminizin başarısız olduğu anlamına gelir
Guo Luchuan

Sadece test ettim ve kesinlikle kaldırılıyor ve kaldırma işlemi yansıtılıyor contentsOfDirectoryAtPath(yani burada dizin önbelleği yok). Bu nedenle, oyun sırasında NSErroriçeriğe baktığınızda ortaya çıkması gereken basit bir hata yapmanız gerekir .
Rob

Yanıtlar:


238

Kodunuzu kontrol ettim. Benim için çalışıyor. Aşağıdaki değiştirilmiş kodu kullanarak aldığınız herhangi bir hatayı kontrol edin

- (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]);
  }
}

Belge dizininde dosya oluşturabilirim ama onu kaldırmaya çalıştığımda her zaman hata alıyorum. Hiç fikrin var mı?
Vadim

Ben çözdüm. Sorun şuydu: Herhangi bir öznitelik olmadan yeni dosya oluşturdum ve anladığım kadarıyla, varsayılan bir NSFileImmutable YES özniteliği verdi. Ya da böyle bir şey. Maalesef kaynakları şimdi gösteremiyorum. Ancak sorun önemsizdi.
Vadim

Kontrol dosyası var mı, gerekli değil mi?
Sangram Shivankar

dosyayı
dizinden siliyor

55

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

@Anil Varghese sayesinde, swift 2.0'da çok benzer bir kod yazdım:

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

İşlevi neden statik hale getirir?
CalZone

Sana kalmış. Gerek yok
Roman Barzyczak

Kaldırıldığından emin olmak için, işlevi çağırmadan önce / sonra dosyanın hala var olup olmadığını kontrol etmenin bir yolu var mı?
luke

1
evet emin: let fileManager = FileManager.default if fileManager.fileExists (atPath: filePath!) {print ("DOSYA KULLANILABİLİR")} else {print ("DOSYA KULLANILAMIYOR")}
Roman Barzyczak

11

Swift 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

Swift'de hem 3 hem de 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)
    }
    }

veya Bu yöntem tüm yerel dosyaları silebilir

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ğrudan denemek için aşağıdakileri son satıra ekleyin. {filemanager.removeItem (atPath: destinationPath) yazdır ("Silindi")} yakala {yazdır ("
Silinmedi

5

Hatayı NULL olarak ayarlamak yerine,

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

bu size gerçekten dosyanın silinip silinmediğini söyleyecektir


3

Sqlite db'yi belge dizininden silmek istiyorum. Sqlite db'yi aşağıdaki cevapla başarıyla siliyorum

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");
    }
}

2
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:new_file_path_str error:&error];
    if (error){
        NSLog(@"%@", error);
    }

1

FreeGor sürümü Swift 3.0'a dönüştürüldü

 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 () ile dosya kaldırma işleminizi iki kez koruyabilirsiniz. İsDeletableFileAtPath (PathName) Eski hata yöntemleri artık çalışmadığından, artık do {} catch {} kullanmanız GEREKİR. isDeletableFileAtPath () bir "atar" değildir (yani "genel func removeItemAtPath (yol: String) atar"), dolayısıyla do ... catch gerektirmez

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

Modern api yöntemiyle ilgi çekiyorsanız, NSSearchPath'den kaçınarak ve belgeler dizinindeki dosyaları silmeden önce filtreliyorsanız, şunları yapabilirsiniz:

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)")
   }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.