문서 디렉토리에서 지정된 파일 삭제


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 인스턴스를 추가하고 removeItemAtPath 후 그것을 확인
드미트리 셰브첸코

1
사용-(BOOL) fileExistsAtPath : (NSString *) path; 이 YES 돌아 오면 이미지의 존재는, 그것은 당신의 제거가 실패 의미 있는지 여부를 확인합니다
구오 Luchuan

방금 테스트 한 결과 확실히 제거되고 제거가 반영됩니다 contentsOfDirectoryAtPath(즉 여기에 디렉토리 캐싱이 포함되지 않음). 따라서 NSError내용 을 볼 때 분명하게 드러나는 간단한 오류가 있어야합니다 .
Rob

답변:


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

문서 디렉터리에 파일을 만들 수 있지만 제거하려고하면 항상 오류가 발생합니다. 아이디어가 있습니까?
Vadim

나는 그것을 해결했다. 문제는 속성없이 새 파일을 만들었고 이해했듯이 기본 속성 NSFileImmutable YES를 제공했습니다. 아니면 그런 것. 지금은 소스를 표시 할 수 없습니다. 그러나 문제는 사소했습니다.
Vadim

파일이 존재하는지 확인이 필요하지 않습니까?
Sangram Shivankar

이 디렉토리에서 파일을 삭제하지만 여전히 시뮬레이터의 사진에서 이미지를 보여주는
사가르 koyani에게

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

@Anil Varghese 덕분에 저는 swift 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)
  }
}

함수를 정적으로 만드는 이유는 무엇입니까?
CalZone

그것은 당신에게 달려 있습니다. 그것은 아무 필요 없다
로마 Barzyczak

파일이 제거되었는지 확인하기 위해 함수를 호출하기 전 / 후에 파일이 여전히 존재하는지 확인하는 방법이 있습니까?
luke

1
예 : let fileManager = FileManager.default if fileManager.fileExists (atPath : filePath!) {print ( "FILE AVAILABLE")} else {print ( "FILE NOT AVAILABLE")}
Roman 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

Swift에서는 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 : destinationPath) print ( "Deleted")} catch {print ( "Not Deleted")}
Abhirajsinh Thakore

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

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

1

FreeGor 버전을 Swift 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 (). isDeletableFileAtPath (PathName)를 사용하여 파일 제거를 이중으로 보호 할 수 있습니다. 지금은 이전 오류 메서드가 더 이상 작동하지 않으므로 do {} catch {}를 사용해야합니다. isDeletableFileAtPath ()는 "throws"(예 : "public func removeItemAtPath (path : String) throws")가 아니므로 do ... catch가 필요하지 않습니다.

let killFile = NSFileManager.defaultManager()

            if (killFile.isDeletableFileAtPath(PathName)){


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

0

최신 API 방식에 관심이 있다면 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)")
   }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.