2013-04-30 2 views
0

В настоящее время я пытаюсь писать и читать текст в том же файле в Objective C.Чтение и запись в тот же файл

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

Перед началом работы я столкнулся с несколькими ошибками, в основном из-за моей неопытности с Objective C, особенно IO. Когда я пытаюсь писать в существующий текстовый файл, где я помещаю файл в проект? В настоящее время я просто перетащил файл в свой проект; Я предполагаю, что это неверно, и именно поэтому большинство моих проблем исходят.

Вот мой код для написания текстового файла:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myFile.txt"]; 

NSFileHandle *filehandle = [NSFileHandle fileHandleForWritingAtPath:filePath]; 
[filehandle seekToEndOfFile]; 
[filehandle writeData:[@"Hello World" dataUsingEncoding:NSUTF8StringEncoding]]; 

После отладки, элемент filePath, содержит очень длинный каталог, который даже не находящиеся в моем каталоге проекта.

Вот мой код для записи в файл:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myFile.txt"]; 

NSError *error; 
NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; 

if (error) 
    NSLog(@"Error reading file: %@", error.localizedDescription); 

myArray = [fileContents componentsSeparatedByString:@"\n"]; 

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

+0

В будущем, пожалуйста, не удаляйте [свой вопрос] (http://stackoverflow.com/questions/16290447/read-and-write-to-same-file-objective-c) и отправляйте его , Отредактируйте его. –

+0

Вы просто спрашиваете, где находится файл на вашем жестком диске, или есть ли какая-то ошибка или неожиданный результат, который возникает при написании? Или что? Пока неясно, с чем вы столкнулись. –

+0

Я извиняюсь за это, я не знал, что делать в этом случае. – Johnrad

ответ

1

Файловая система для IOS приложений несколько ограничена, простое объяснение правила s будет следующим:

  • Ваш проект и все его ресурсы в комплекте.
  • Пакет - это просто папка (обычно называемая чем-то вроде «YourAppName.app»).
  • Как только пакет установлен на устройство, ваше приложение не имеет достаточных разрешений для изменения (записи/удаления/переименования/etc) файлов в комплекте.
  • Когда пакет установлен, он также изолирован песочницей.
  • Песочница - это только папка, содержащая ваш комплект и некоторые другие файлы и папки, которые необходимо запустить вашему приложению.
  • У вас есть права на запись в некоторые папки в песочнице, а именно папка «Документы» и папка «Кэши».
  • Вы не можете получить доступ к файлам вне изолированной программной среды приложения.

Типичная структура папок:

SandboxFolder 
| 
|--- Documents <-- this is the folder you are writing to in your code 
| 
|--- YourAppName.app <-- this is your bundle folder 
| 
|--- Library 
| | 
| |--- Caches 
| | 
| |--- Preferences 
| 
|--- tmp 

Так короче говоря, любые файлы, которые вы добавляете в свой проект завершится в связке вашего приложения, вы можете прочитать файлы в вашем приложении, самый простой способ для поиска файлов в вашем пакете используется метод утилиты - (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension, вы можете найти информацию об этом методе в NSBundle documentation.

Что вы делаете в своих примерах кода полезно для чтения и записи в файл в папке документов (в вашей песочнице), это прекрасно, но помните, что если ваше приложение поддерживает файлы iCloud в папке документов, они будут загружены в iCloud автоматически. Взгляните на iCloud documentation для получения дополнительной информации.

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

// print the path to the documents folder to the console // 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSLog(@"Documents path: %@", documentsDirectory); 
  • в консоли, искать пути документов (поиск по «путям документов:») и скопировать его
  • Перейти к поиску и открыть меню Go -> Перейти в папку ... из строки меню
  • Paste путь в поле и нажмите ok
  • Открывается новое окно с папкой документов, если вы поднимаетесь на один уровень, вы окажетесь в корневой части вашей песочницы и сможете увидеть свой комплект приложений и свободно перемещаться, чтобы открывать файлы и знакомиться со структурой.

Имейте в виду, что для просмотра файлов в вашем комплекте вам нужно щелкнуть правой кнопкой мыши и выбрать «показать содержимое пакета» из контекстного меню.

Надеюсь, это поможет.

+0

Кроме того, для чтения структуры файла (и изменения файлов) на устройстве попробуйте [iExplorer] (http://www.macroplant.com/iexplorer/) – Dario

+0

Большое вам спасибо за это. Мне очень неловко, что я не мог понять это сам по себе, я думаю, это от моей неопытности с разработкой iOS. Но я должен где-то учиться. Мне никогда не приходило в голову, что мне нужно заглянуть в файловую систему симуляторов, чтобы найти мой файл, а не мой проект. В очередной раз благодарим за помощь! – Johnrad

0

Если вы пытаетесь в тренажере, и хочет, чтобы открыть его в макинтош

скопировать путь к файлу из журнала [Dont включать имя файла] Open Finder> GO> Переход к папке открывает окно вставьте путь и нажмите клавишу ВВОД

Результат: окно в искателем открывается, показывая папку и файл внутри

0

Как уже упоминалось, файлы в вашем проекте попадают в ваш комплект, поэтому вы никогда не сможете писать им (вы можете/могли бы использовать Mac для старомодных не подписанных приложений, но вы должны во всяком случае).

Что вы можете сделать, это

  1. Включите файл в пачке.
  2. На первом запуске прочтите его, а затем напишите все содержимое в папку «Документы».
  3. Убедитесь, что вы установили флаг где-то, где вы завершили первую настройку запуска, поэтому в следующий раз этого не произойдет. Если вы хотите, вы можете использовать существование файла в каталоге «Документы», чтобы определить, что он был скопирован (тип самодокументирования и легко обновляется).
Смежные вопросы