Запись строки NSS в относительный файл - PullRequest
1 голос
/ 01 декабря 2011

Я получаю странное поведение при записи объектов NSString и NSData в относительные пути к файлам. Вот пример:

NSString *string = @"I am a file!";
NSError *error =  nil;
NSString *fileName = @"text.txt";
BOOL written = [string writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:&error];

if (written) {
    NSLog(@"Successfully written to file.");
} else {
    NSLog(@"Error: %@", [error localizedDescription]);
}

Когда я запускаю это, я всегда получаю «Успешно записано в файл», но файла там нет. Каким-то образом программа считает, что она прошла успешно, и не генерируется никаких ошибок.

Что я делаю не так? (Я на Mac OS X Lion)

Ответы [ 3 ]

1 голос
/ 01 декабря 2011
NSFileManager * fm = [NSFileManager new];
NSString * dirPath = [fm currentDirectoryPath];
NSString * absPath = [dirPath stringByAppendingPathComponent:@"myfile.file"];
[fm release];

Имейте в виду, что currentDirectoryPath отражает рабочий каталог ваших программ, пока вы не измените его с помощью -changeCurrentDirectoryPath:, рабочий каталог программ может отличаться в зависимости от того, как он был запущен, и на него нельзя положиться.

1 голос
/ 01 декабря 2011

Запись в текущий каталог.Текущий каталог по умолчанию при запуске чего-либо под Xcode 4 будет ~/Library/Developer/Xcode/DerivedData/<prodDir>/Build/Products/<configuration>.Вы можете изменить это, используя схему.Когда вы запускаете программу из командной строки, то текущим каталогом является тот, который был текущим каталогом при запуске программы.Если вы используете Finder для запуска приложения, то текущим каталогом часто будет /.

В принципе, нормально писать текущий рабочий каталог.Это очень распространено в приложениях командной строки.Что касается комментария @ Craig о writeToFile: ожидании абсолютного пути, я не думаю, что это действительно так.Он ожидает и пишет в путь.Это не волнует, является ли это абсолютным или относительным.Это базовый класс, и он так же полезен в программе командной строки, как и графический интерфейс.

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

Но вопрос о том, почему вы не получили ошибку, это потому, что она, вероятно, успешно написала ее,Вы просто не знали, где искать.

1 голос
/ 01 декабря 2011

Первый параметр метода writeToFile: (в вашем примере) - это относительный путь, но вы, вероятно, хотите использовать абсолютный путь. В противном случае система разместит ваши файлы относительно текущего исполняемого файла. Когда вы работаете внутри XCode, это может быть не там, где вы ожидаете, что они в конечном итоге. (Как Роб упомянул в своем ответе, это местоположение несколько скрыто и может меняться в зависимости от того, какую версию Xcode вы используете.)

Если вы хотите создать путь к каталогу, используя NSString объекты, я бы порекомендовал метод stringByAppendingPathComponent::

...
NSString *directory = @"/Users/Mikael/Desktop";
NSString *filename = @"MyFile.txt";

NSString *fullPath = [directory stringByAppendingPathComponent:filename];
...

Обратите внимание, что этот метод позаботится о том, чтобы ваши слеши были правильно сформированы.

...