/ / FileHandle nie akceptuje moich adresów URL w celu dostępu do zapisu - szybkie, kakao, pisanie plików, uchwyt pliku

FileHandle nie akceptuje moich adresów URL dla dostępu do zapisu - swift, kakao, zapisywanie plików, uchwyt pliku

Chciałbym otworzyć plik wyjściowy o unikatowej nazwie do zapisu albo listy lub danych, ale nie mam szczęścia w uzyskiwaniu uchwytu przy użyciu procedury URL z init (fileURLWithPath :) lub init (ciąg :)

func NewFileHandleForWritingFile(path: String, name: String, type: String, outFile: inout String?) -> FileHandle? {
let fm = FileManager.default
var file: String? = nil
var uniqueNum = 0

while true {
let tag = (uniqueNum > 0 ? String(format: "-%d", uniqueNum) : "")
let unique = String(format: "%@%@.%@", name, tag, type)
file = String(format: "%@/%@", path, unique)
if false == fm.fileExists(atPath: file!) { break }

// Try another tag.
uniqueNum += 1;
}

outFile = file!

do {
let fileURL = URL.init(fileURLWithPath: file!)
let fileHandle = try FileHandle.init(forWritingTo: fileURL)
print("(file!) was opened for writing")
//set the file extension hidden attribute to YES
try fm.setAttributes([FileAttributeKey.extensionHidden: true], ofItemAtPath: file!)
return fileHandle
} catch let error {
NSApp.presentError(error)
return nil;
}
}

pokazuje debugger

pokazuje debugger

który dla tej procedury inicjującej URL dodaje schemat(plik: //), ale poza tym to samo co inne, i wolałbym preferować nowsze metody, które rzucają odżywianie (-1) tylko przy użyciu ścieżek. Zgłoszony błąd (2) jest ENOENTEM (nie ma takiej jednostki! ?) jak potrzebuję uchwyt Napisz do Jestem zdezorientowany, jak inaczej go zdobyć? Przykładowa ścieżka to nowy folder utworzony na pulpicie w celu segregowania.

Odpowiedzi:

3 dla odpowiedzi № 1

Nie można utworzyć dojścia do nieistniejącego pliku. To właśnie powoduje błąd ENOENT.

Posługiwać się FileManager createFile(atPath:contents:attributes:) aby utworzyć plik tuż przed utworzeniem uchwytu pliku.

do {
fm.createFile(atPath: file!, contents: nil, attributes: [FileAttributeKey.extensionHidden: true])
let fileURL = URL(fileURLWithPath: file!)
let fileHandle = try FileHandle(forWritingTo: fileURL)
print("(file!) was opened for writing")

return fileHandle
} catch let error {
NSApp.presentError(error)
return nil;
}

3 dla odpowiedzi № 2

W przeciwieństwie do poprzedniej odpowiedzi, polecam korzystanie z danych write(to:options:) API zamiast FileManager createFile(atPath:contents:attributes:), ponieważ jest to interfejs API oparty na adresie URL, który jestogólnie są lepsze niż te oparte na ścieżce. Metoda Data generuje również błąd zamiast zwracać tylko fałsz, jeśli się nie powiedzie, więc jeśli coś pójdzie nie tak, możesz powiedzieć użytkownikowi, dlaczego.

try Data().write(to: fileURL, options: [])

Sugerowałbym również zastąpienie ścieżki FileManager.fileExists(atPath:) z adresem URL checkResourceIsReachable():

if false == ((try? fileURL.checkResourceIsReachable()) ?? false)