iPhone에서 쓰기 가능한 경로를 얻으려면 어떻게해야합니까?
이 질문에 대한 완전한 답변을 다른 게시물에 작성했기 때문에이 질문을 게시하고 있습니다. 원본에는 적용되지 않았지만 낭비하기에는 너무 유용하다고 생각했습니다. 따라서 나는 다른 사람들이 질문과 답변을 구체화 할 수 있도록 이것을 커뮤니티 위키로 만들었습니다. 답변이 유용하다고 생각되면 질문에 투표 해주세요. 커뮤니티 위키이기 때문에이 투표에 대한 점수를 얻어서는 안되지만 다른 사람들이 찾는 데 도움이 될 것입니다.
iPhone에서 파일 쓰기가 허용되는 경로를 어떻게 얻을 수 있습니까? 시뮬레이터에서 원하는 곳에 (오해의 소지가있는) 글을 쓸 수 있지만, iPhone에서는 특정 위치에만 글을 쓸 수 있습니다.
고려해야 할 쓰기 가능한 경로에는 세 가지 종류가 있습니다. 첫 번째는 보관하려는 항목을 저장하고 iTunes를 통해 사용자가 사용할 수 있도록하는 문서입니다 (3.2부터).
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
두 번째로 Documents 디렉토리와 매우 유사하게 보관하고 싶은 구성 파일과 쓰기 가능한 데이터베이스를 저장하는 Library 폴더가 있지만 사용자가 iTunes를 통해 엉망이되는 것을 원하지 않습니다.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];
사용자가 3.2 (iPad)보다 오래된 장치를 사용하여 iTunes에서 파일을 볼 수 없더라도 NSLibraryDirectory 상수는 iPhoneOS 2.0 이후로 사용 가능하므로 3.0을 대상으로하는 빌드에 사용할 수 있습니다. 그). 또한 사용자가 문서를 수정할 수 있도록 앱에 플래그를 지정하지 않는 한 사용자는 아무것도 볼 수 없으므로 현재 문서를 사용하는 경우 사용자 문서 지원을 위해 업데이트 할 때 위치를 변경하는 한 괜찮습니다.
마지막으로 캐시 디렉토리가 있습니다. 여기서 신경 쓰지 않는 이미지를 장기적으로 넣을 수 있습니다 (휴대 전화가 언젠가는 삭제할 수 있습니다).
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
[[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}
실제로 Caches 디렉토리를 생성해야하므로, 글을 쓸 때 매번 확인하고 생성해야합니다! 일종의 고통이지만 그것이 방법입니다.
그런 다음 쓰기 가능한 경로가 있으면 다음과 같이 파일 이름을 추가하면됩니다.
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"SomeDirectory/SomeFile.txt"];
또는
NSString *filePath = [cachePath stringByAppendingPathComponent:@"SomeTmpFile.png"];
읽기 또는 쓰기에 해당 경로를 사용하십시오.
위의 예제 문자열 중 하나가 사용하고있는 쓰기 가능한 경로 중 하나에 하위 디렉터리를 만들 수 있습니다 (하나가 생성되었다고 가정).
사진 라이브러리에 이미지를 쓰려는 경우 파일 시스템 호출을 사용하여이를 수행 할 수 없습니다. 대신 메모리에 UIImage가 있어야하고 UIImageWriteToSavedPhotosAlbum()
UIKit에서 정의한 함수 호출을 사용해야합니다 . 대상 형식이나 압축 수준을 제어 할 수 없으며 이러한 방식으로 EXIF를 연결할 수 없습니다.
위의 Kendall & Dave 덕분에이 수정안이 도움이 될 것이라고 생각했습니다. 일회성 디버그 코드를 사용할 때 Mike Ash의 NSBlog 에서이 트릭 을 사용 하여 임시 변수 isDir & error를 제거하여 줄 수를 최소화하고 자세한 내용을 거의 견딜 수있게 만들었습니다.
NSFileHandle *dumpFileHandle = nil;
#ifdef DEBUG
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&(BOOL){0}])
[[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:YES attributes:nil error:&(NSError*){nil}];
NSString *dumpPath = [cachePath stringByAppendingPathComponent:@"dump.txt"];
[[NSFileManager defaultManager] createFileAtPath:dumpPath contents:nil attributes:nil];
[(dumpFileHandle = [NSFileHandle fileHandleForWritingAtPath:dumpPath]) truncateFileAtOffset:0];
#endif
if (dumpFileHandle) [dumpFileHandle writeData:blah];
참고 URL : https://stackoverflow.com/questions/1567134/how-can-i-get-a-writable-path-on-the-iphone
'Development Tip' 카테고리의 다른 글
DataGridView CheckBox 이벤트 변경을 감지하는 방법은 무엇입니까? (0) | 2020.10.25 |
---|---|
빈 셀의 테두리를 표시하는 CSS? (0) | 2020.10.25 |
트위터 부트 스트랩에서 행 줄 제거 (0) | 2020.10.25 |
Javascript에서 HTML5 필수 속성을 설정하는 방법은 무엇입니까? (0) | 2020.10.25 |
프로그래밍 방식으로 버튼을 만들고 배경 이미지 설정 (0) | 2020.10.25 |