2013-04-30 5 views
0

현재 목표 C의 동일한 파일에 텍스트를 쓰고 읽으려고합니다.동일한 파일 읽기 및 쓰기

묶음 텍스트 파일에 쓰기를 시도하기 전에. 이후, 나는 이것이 받아 들일 수 없다는 것을 배웠다. 파일에 쓸 때 사용 권한 문제가 있음을 이해합니다.

저는 주로 Objective C, 특히 IO에 대한 경험이 부족하여 몇 가지 오류가 있습니다. 기존 텍스트 파일에 쓰려고 할 때 프로젝트에서 파일을 어디에 배치합니까? 현재 나는 파일을 끌어서 내 프로젝트에 놓았습니다. 나는 이것이 틀렸다고 가정하고 있으며, 이것이 내 문제의 대부분이 어디서 오는지에 대한 것이다.

디버깅, 요소 filePath
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]]; 

가, 심지어 내 프로젝트 디렉토리에 위치하지 않는 매우 긴 디렉토리를 포함

다음은 텍스트 파일을 작성하기위한 내 코드입니다.

여기 파일에 쓰기에 대한 내 코드입니다 : 나는 파일의 대부분이 파일이 존재하는 곳에서 오는 이해

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

파일 시스템 내부의 파일을 보여주는 열립니다를 어느 정도 규칙의 간단한 설명을 제한

  • 프로젝트와 모든 리소스가 번들로 제공됩니다.
  • 번들은 단지 폴더 (일반적으로 "YourAppName.app"와 같은 이름)입니다.
  • 번들을 장치에 배포하면 응용 프로그램에 번들 내의 파일을 변경 (쓰기/삭제/이름 바꾸기/etc) 할 권한이 없습니다.
  • 번들이 설치되면 샌드 박스도됩니다.
  • 샌드 박스는 번들과 앱이 실행해야하는 다른 파일 및 폴더가 들어있는 폴더입니다.
  • "Documents"폴더와 "Caches"폴더와 같은 일부 샌드 박스의 폴더에 대한 쓰기 권한이 있습니다.
  • 응용 프로그램의 샌드 박스 외부의 파일에는 액세스 할 수 없습니다.

전형적인 폴더 구조는 다음과 같습니다

그래서 짧은에, 당신은 응용 프로그램의 번들에 종료됩니다 프로젝트에 추가 한 파일, 당신은 응용 프로그램에서 파일을 읽을 수
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); 
    콘솔에서
  • , 문서의 경로를 찾아 ("문서 경로 :"에 대한 검색) 및 찾기 메뉴 이동을 열고 그것을
  • 이동 복사 -> 메뉴 바
  • 붙여 넣기에서 ... 폴더로 이동 필드로가는 경로를 입력하고 확인 버튼을 누릅니다.
  • 문서 폴더와 함께 새 창이 열리 며 한 단계 위로 올라가면 샌드 박스 루트에있게되며 앱 번들을보고 자유롭게 파일을 열어 구조에 익숙해 질 수 있습니다.

번들 내의 파일을 보려면 마우스 오른쪽 버튼을 클릭하고 컨텍스트 메뉴에서 "패키지 내용 표시"를 선택해야합니다.

이 정보가 도움이되기를 바랍니다.

+0

또한 장치의 파일 구조 (및 파일 수정)를 읽으려면 [iExplorer] (http://www.macroplant.com/iexplorer/) – Dario

+0

감사합니다. 내가 스스로 알아낼 수 없었던 것은 당혹 스럽다. iOS 개발에 익숙하지 않은 것 같다. 그러나 나는 어딘가에서 배워야 만한다. 내 프로젝트 대신 내 파일을 찾기 위해 시뮬레이터 파일 시스템을 조사해야한다는 것을 알지 못했습니다. 도와 주셔서 다시 한 번 감사드립니다! – Johnrad

0

당신이 시뮬레이터에서 노력하고

로그에서 파일 경로를 복사

맥에서 열어하고자하는 경우 열기 찾기> GO [파일 이름을 포함하지 말아]> 창이 열립니다 폴더로 이동 경로와 언론

결과 입력하여 붙여 넣기 : 이 파인더에있는 창은 폴더와 iOS 앱에 대한

0

다른 사람들이 언급했듯이 프로젝트의 파일은 번들로 끝나기 때문에 절대 쓸 수는 없습니다 (Mac에서는 구식이 아닌 서명 된 앱을 사용하거나 할 수 있습니다. 't, 어쨌든). 당신이 할 수있는 일

  1. 번들에있는 파일을 포함합니다.
  2. 처음 실행하면 읽은 다음 전체 내용을 문서 폴더에 씁니다.
  3. 첫 번째 실행 설정을 완료 한 장소에 플래그를 설정 했으므로 다음 번에 해당 플래그가 설정되지 않도록하십시오. 원할 경우 Documents 디렉토리에있는 파일의 존재 여부를 확인하여 파일이 복사되었음을 확인할 수 있습니다 (일종의 자체 문서화이며 쉽게 유지할 수 있음).