2013-02-22 8 views
102

私のアプリケーションドキュメントディレクトリから画像を削除します。私は画像を削除するために書いたコードは:指定したファイルをドキュメントディレクトリから削除する

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

部分的に動作します。このコードはディレクトリからファイルを削除しますが、ディレクトリの内容をチェックしているときには、そこにイメージ名が表示されます。私はディレクトリからそのファイルを完全に削除したい。同じことをするためにコードで何を変更する必要がありますか?代わりにNULLに設定されたエラーを持つのおかげ

+4

、NSErrorインスタンスを追加し、removeItemAtPath後にそれをチェックスウィフトに変換 –

+1

使用 - (BOOL)fileExistsAtPath:(NSStringの*)パス。イメージが存在するかどうかを確認するために、YESを返した場合、削除が失敗したことを意味します。 –

+0

これをテストしたところ、削除が確実に行われ、削除は 'contentsOfDirectoryAtPath'に反映されます。だから、あなたは 'NSError'の内容を見て明らかになるはずの単純なエラーがなければなりません。 – Rob

答えて

227

を削除するかどうこれはあなたを教えてくれます

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

に設定されています。それは私のために働いています。

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

ドキュメントディレクトリにファイルを作成できますが、削除しようとすると常にエラーが発生します。あなたはなにか考えはありますか? – Vadim

+0

@VadymKどのようなエラーが発生していますか?あなたのコードを見ることができますか? –

+0

私はそれを解決しました。問題は次のとおりです。属性なしで新しいファイルを作成しました。わかっているように、デフォルトの属性NSFileImmutable YESを与えました。またはそのようなもの。申し訳ありませんが、現在ソースを表示できません。しかし問題はほんのわずかでした。 – Vadim

5

は、それはそれは実際に私はあなたのコードをチェックし、ファイル

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

スウィフト3.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) 
    } 
} 

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に、私は、SWIFT 2.0の非常に似たコードを書きました

+0

なぜ機能を静的にする? – CalZone

+0

それはあなた次第です。それは不要です –

+0

ファイルが削除されていることを確認するために関数を呼び出す前後にファイルがまだ存在するかどうかをチェックする方法はありますか? – luke

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

NSFileManager.defaultManager()でファイルの削除を二重に保護することができます。isDeletableFileAtPath(PathName)do {} catch {}を使用する必要があります。 isDeletableFileAtPath() "スロー" されていない(すなわち "公共のfunc removeItemAtPath(パス:String)を投げる") ので、それは私が私のsqliteのを削除したい...やるキャッチ

let killFile = NSFileManager.defaultManager() 

      if (killFile.isDeletableFileAtPath(PathName)){ 


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

を必要としません。文書からのDBは、以下のあなたが削除する前に、ドキュメントディレクトリ内NSSearchPathとフィルタファイルを避け、近代的なAPIの方法で興味深い場合

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

答えることで成功したsqliteのDBを削除directory.I、あなたが行うことができますように:

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

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") 
      } 
     } 
    } 
} 
関連する問題