2011-02-08 2 views
4

Этот код копирует указанный файл и помещает его в каталог Docs. Я пытаюсь создать простое решение для резервного копирования. Проблема в том, что эта операция не перезаписывает существующий файл, если операция повторяется.Перезаписывание файла программно в Cocoa

Два вопроса:

Какой самый лучший способ переписать в коде?

Насколько сложно было бы добавить текущую дату к каждому скопированному файлу? В этом случае операция перезаписывания не будет выполняться. Это было бы гораздо более полезно для хранения инкрементных резервных копий. Если я решил сделать это таким образом, я понимаю, что мне нужно создать новый путь, чтобы все было организовано.

Спасибо.

Пол

NSString * name = @"testFile"; 
NSArray * files = [NSArray arrayWithObject: name]; 

NSWorkspace * ws = [NSWorkspace sharedWorkspace]; 

[ws performFileOperation: NSWorkspaceCopyOperation 
        source: @"~/Library/Application Support/testApp" 
      destination: @"~/Documents/" 
        files: files 
        tag: 0]; 
+1

На каждом пути, содержащем тильду, вы должны вызывать 'stringByExpandingTildeInPath' следующим образом:' [@ "~/Documents /" stringByExpandingTildeInPath] '. –

+0

Хорошо, спасибо. – Paul

+0

@Paul он сделал эту работу? –

ответ

2

Вы можете попробовать использовать NSFileManager, пример ниже (непроверенные):

// Better way to get the Application Support Directory, similar method for Documents Directory 
- (NSString *)applicationSupportDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); 
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory(); 
    return [basePath stringByAppendingPathComponent:@"testApp"]; 
} 

- (void) removeFile { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *applicationSupportDirectory = [self applicationSupportDirectory]; 
    NSError *error = nil; 

    NSString* filePath = [applicationSupportDirectory stringByAppendingPathComponent: @"testFile"]; 
    if ([fileManager fileExistsAtPath:filePath isDirectory:NULL]) { 
     [fileManager removeItemAtPath:filePath error:&error]; 
    } 
} 

Edit: Посмотрите на NSFileManager Class Reference для других функций, которые могут быть полезны (для вашего второй вопрос).

+0

Спасибо Allot Johnny. Я посмотрю ... – Paul

+0

Я получаю «Passing argument 2» removeItemAtPath: error. ' из несовместимого типа указателя "предупреждение – Paul

+0

К сожалению, это была опечатка. Определение функции - '- (BOOL) removeItemAtPath: (NSString *) ошибка пути: (NSError **) error', которая требует' NSError ** '. Я обновил свой ответ. – David

Смежные вопросы