2011-05-02 20 views
14

Próbuję pobrać zawartość z jednego pliku i zapisać go w innym. Czytam dobrze, ale nie jestem w stanie zapisać go w innym pliku.Zapisywanie pliku przy użyciu [NSBundle mainBundle] kończy się niepowodzeniem.

Mam bazę danych słów. Chcę rozdzielić słowa na różne pliki na podstawie liczby liter. Wszystkie czteroliterowe słowa przechodzą do jednego pliku i tak dalej. Dodałem plik txt o nazwie „4letter” do moich zasobów i po to mój kod:

NSError *error; 

//READ 
NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"]; 
NSString *test = [NSString stringWithContentsOfFile:dbFile encoding:NSUTF8StringEncoding error:&error]; 

//convert from string to array 
NSArray *lines = [test componentsSeparatedByString:@"\n"]; 

NSFileHandle *logFile = nil; 
logFile = [NSFileHandle fileHandleForWritingAtPath:[[NSBundle mainBundle] pathForResource:@"4letter" ofType:@"txt"]]; 

//Test if write works 
for (int i=0; i<5; i++) 
{ 
    NSString *randomAnagram = [[lines objectAtIndex:i] lowercaseString]; 
    [logFile writeData: [randomAnagram dataUsingEncoding: NSNEXTSTEPStringEncoding]]; 
} 

Odpowiedz

22

w iOS, nie można pisać do pliku w aplikacji w pakiecie - cała wiązka jest tylko do odczytu . Zamiast tego użyj ścieżki do folderu Dokumenty.

+1

Jaka jest ścieżka do folderu dokumentów? Moim celem jest iOS. Po napisaniu do niego gdzie mogę znaleźć folder? – Abhinav

+4

Zobacz [Standardowe katalogi systemowe] (http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/LowLevelFileMgmt/Articles/StandardDirectories.html#//apple_ref/doc/uid/20001279-SW4), aby dowiedzieć się jak znaleźć katalog Documents, a także inne standardowe katalogi. – Caleb

+1

Aby uzyskać ścieżkę do folderu dokumentów, należy użyć: NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDocumentsDirectory, NSUserDomainMask, YES); NSString * documentsDirectory = [paths objectAtIndex: 0]; – OscarVGG

4

Pakiet aplikacji jest tylko do odczytu. Istnieją dwa sposoby widziałem:

1) Napisz w folderze Dokumenty:

NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path =  [myPathList  objectAtIndex:0]; 

2) Za pomocą bazy danych sqlite. Jest to to samo co 1 (mimo to musisz zachować db w dokumentach), ale używasz bazy danych sqlite. Myślę, że jest to lepsze niż wiele plików txt i plist: here's a tutorial on the topic.

+0

Wielkie dzięki. Zobaczmy, czy uda mi się to osiągnąć. – Abhinav

7

Jak powiedział Caleb, nie można pisać w katalogu aplikacji, ale można pisać w folderze Dokumenty aplikacji. Można to uzyskać w ten sposób:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
8

Zobacz specjalne File System Programming Guide dla lepszego zrozumienia.
W systemie iOS nie można pisać do pliku w pakiecie aplikacji - cały pakiet jest tylko do odczytu.

Rozważ przeczytanie iOS Data Storage Guidelines, aby lepiej zrozumieć przeznaczenie poniższych katalogów, w kontekście kopii zapasowej iCloud.

< Application_Home> /AppName.app

Jest to katalog zawierający pakiet samą aplikację. Nie pisz do tego katalogu w żadnej postaci . Aby zapobiec manipulowaniu, katalog pakietów jest podpisywany podczas instalacji. Zapis w tym katalogu zmienia podpis i uniemożliwia ponowną aplikację.


< Application_Home>/Dokumenty/

Użyj tego katalogu do przechowywania ważnych dokumentów użytkownika i dane aplikacji plików. Dane krytyczne to wszelkie dane, których aplikacja nie może odtworzyć, , na przykład treści generowane przez użytkowników. Zawartość tego katalogu może być udostępniona użytkownikowi poprzez udostępnianie plików. Zawartość tego katalogu jest zapisywana przez iTunes.


< Application_Home>/Library/

Ten katalog jest katalogiem najwyższego poziomu dla plików, które nie są użytkownik pliki danych. Zazwyczaj pliki są umieszczane w jednym z kilku standardowych podkatalogów , ale można również tworzyć niestandardowe podkatalogi dla plików , które mają zostać zarchiwizowane, ale nie mogą być narażone na działanie użytkownika. Nie powinieneś używać tego katalogu dla plików danych użytkownika. Zawartość tego katalogu (z wyjątkiem podkatalogu podręcznego Caches) jest zapisywana w kopii zapasowej pod adresem iTunes. Aby uzyskać dodatkowe informacje o katalogu biblioteki, zobacz „Biblioteka Katalog sklep App-konkretne pliki.”

Zobacz pełną listę (tmp /, Dokumenty/Skrzynka odbiorcza) w iOS Standard Directories: Where Files Reside

UPDATE
I użyć metody NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:

+0

Nawet czytam ten pełny dokument. Mam zamieszanie, jeśli mam zapisać mój bardzo plik lub pliki wideo w folderze dokumentów. Wtedy będzie łatwo dostępny dla innych. – python

+1

Nie można udostępniać takich plików, ponieważ każdy plik jest widoczny tylko z poziomu aplikacji. Aby udostępnić potrzebne dokumenty ["Podręcznik programowania do obsługi interakcji z dokumentami"] (https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/DocumentInteraction_TopicsForIOS/Introduction/Introduction.html#//apple_ref/doc/uid/ TP40010403) – DanSkeel

2

używam następujący kod:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"]; 

NSString *[email protected]"Kostas"; 

[data writeToFile:appFile atomically:YES]; 

NSString *myData = [NSString stringWithContentsOfFile:appFile]; 

NSLog(@"Data : %@ ",myData); 
+2

Co to robi inaczej niż kod w pytaniu? Dlaczego kod w pytaniu kończy się niepowodzeniem i jak Twój kod pozwala uniknąć tego problemu? –

+2

Inaczej jest to, że umieszczam mój plik w katalogu dokumentów aplikacji, gdzie mam dostęp do zapisu. Kod w pytaniu używa pakietu aplikacji, który jest tylko do odczytu. – Kostas

Powiązane problemy