2017-09-19 7 views
1

ZIPFoundation lib를 사용하여 Swift의 압축 파일에 파일을 추가하려고합니다.ZIPFoundation을 사용하여 원하는 경로의 아카이브에 파일을 추가하는 방법은 무엇입니까?

/ /folder1/ /folder2/ <-- Move file here. 는 현재 아카이브에 내 파일을 추가하려면이 옵션을 사용하여,하지만 난 매개 변수의 논리를하지 않는 :

아카이브는 다음과 같습니다

public func addEntry(with path: String, relativeTo baseURL: URL)

Archive 개체를 만들고 addEntry()을 사용하여 파일을 추가하는 방법은 파일을 보관 경로의 루트 경로에 추가하지 않는 방법이 있습니까?

코드 편집 : ZIP 아카이브의

internal func moveLicense(from licenseUrl: URL, to publicationUrl: URL) throws { 
    guard let archive = Archive(url: publicationUrl, accessMode: .update) else { 
     return 
    } 
    // Create local folder to have the same path as in the archive. 
    let fileManager = FileManager.default 
    var urlMetaInf = licenseUrl.deletingLastPathComponent() 

    urlMetaInf.appendPathComponent("META-INF", isDirectory: true) 
    try fileManager.createDirectory(at: urlMetaInf, withIntermediateDirectories: true, attributes: nil) 

    let uuu = URL(fileURLWithPath: urlMetaInf.path, isDirectory: true) 
    // move license in the meta-inf folder. 
    try fileManager.moveItem(at: licenseUrl, to: uuu.appendingPathComponent("license.lcpl")) 
    // move dir 
    print(uuu.lastPathComponent.appending("/license.lcpl")) 
    print(uuu.deletingLastPathComponent()) 
    do { 
    try archive.addEntry(with: uuu.lastPathComponent.appending("license.lcpl"), // Missing '/' before license 
         relativeTo: uuu.deletingLastPathComponent()) 
    } catch { 
     print(error) 
    } 
} 
// This is still testing code, don't mind the names :) 
+0

마지막 catch 블록에 오류가 인쇄되면 ZIPFoundation이 'url'에서 파일에 액세스 할 수 없음을 의미합니다. 앱에 내장 API가있는 특정 파일에 대한 액세스 권한이 있는지 확인할 수 있습니까? 예 : guard let content = 시도 하시겠습니까? 데이터 (contentsOf : url) else {return} 이것도 실패하면 단순히 권한 문제 일뿐입니다. 앱의 컨테이너 밖에있는 파일을 가리키는 URL입니까? –

+0

예이 콘텐츠에 대한 액세스 권한이 있습니다. 위 코드를 사용하면 'content'가 제대로 초기화됩니다. –

+1

입력 경로에 경로 구분 기호가 없습니다. print 문에서 .appending ("/ license.lcpl")을 사용하는 동안 addEntry의 첫 번째 인수에 "/"를 추가하지 마십시오. –

답변

1

경로 항목은 가장 현대적인 파일 시스템에서 같은 정말 계층 경로 없습니다. 그들은 단지 식별자 일뿐입니다. 일반적으로 이러한 식별자는 원본 파일 시스템의 항목을 가리키는 경로를 저장하는 데 사용됩니다.

ZIPFoundation의 addEntry(with path: ...) 메소드는 위의 사용 사례를위한 편리한 메소드 일뿐입니다.
예를 들어, 우리가 실제 파일 시스템에서 다음 경로를 가진 파일에서 항목을 추가 할 가정 해 봅시다 : 우리는 아카이브 내에서 fileA.txt 항목을 식별하는 상대 경로를 사용하려면

/temp/x/fileA.txt 

우리가 사용할 수 있습니다

archive.addEntry(with: "x/fileA.txt", relativeTo: URL(fileURLWithPath: "/temp/") 

나중에이 우리가 가진 항목을 찾아 볼 수있는 것 :

archive["x/fileA.txt"] 

우리가 거라고 경우 파일 이름을 제외한 모든 경로 정보를 유지하려면 on't, 우리가 사용할 수 있습니다 더 많은 제어가 필요한 경우

archive["fileA.txt"] 

: 이것은 우리가 그냥 파일 이름을 사용하여 항목을 조회 할 수 있도록 할

let url = URL(fileURLWithPath: "/temp/x/fileA.txt" 
archive.addEntry(with: url.lastPathComponent, relativeTo: url.deletingLastPathComponent()) 

경로/파일 이름 위에 closure based API in ZIPFoundation을 사용할 수 있습니다. 이것은 입력 내용이 메모리에서 왔거나 공통 상위 디렉토리가없는 파일의 항목을 추가하려는 경우에 특히 유용합니다.

+1

답장을 보내 주셔서 감사합니다. 다시 시도하고 결과를 알려 드리겠습니다. –

+0

좋아요, 실제로 그 일을하고 있지만 오류가 있습니다. 오류 코드 = 257이 파일은 xx 파일을 열 수 없습니다. 그것을 볼 수있는 권한이 없습니다. " 나는 .update 모드를 사용하여 아카이브를 엽니 다. 나는 아직도 뭔가를 놓치고 있습니까? 편집 : 나는 시뮬레이터에, 만약 그 놀이에 입력이야 –

+0

당신은 당신이 추가하려고하는 파일에 대한 오류가 발생합니까? 코드로 질문을 업데이트하면 좀 볼 수 있습니다. –