/ / FileHandle neakceptuje moje URL na prístup na zápis - rýchle, kakao, písanie súborov, filehandle

FileHandle neakceptuje moje URL pre prístup na zápis - rýchly, kakao, písanie súborov, filehandle

Chcel by som otvoriť jednoznačne pomenovaný výstupný súbor na zapisovanie buď do zoznamov, alebo do dát, ale nemal som šťastie pri získaní popisovača pomocou rutiny URL init (fileURLWithPath :) alebo init (string :)

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;
}
}

debugger ukazuje

debugger ukazuje

ktorý pre túto rutinu URL init pridáva schému(file: //), ale inak to isté ako ostatné, a ja by som radšej uprednostnil novšie metódy, ktoré vyvolávajú opakovanie (-1), keď sa používajú iba cesty. Vyhodená chyba (2) je ENOENT (žiadna takáto entita! ?), ako potrebujem rukoväť Písať Som zmätený, ako iný ho získať? Vzorová cesta je nový priečinok vytvorený na pracovnej ploche, ktorý sa dá triediť.

odpovede:

3 pre odpoveď č. 1

Nemožno vytvoriť popisovač súboru pre neexistujúci súbor. To spôsobuje chybu ENOENT.

použitie FileManager createFile(atPath:contents:attributes:) na vytvorenie súboru tesne pred vytvorením popisovača súboru.

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 pre odpoveď č. 2

Na rozdiel od predchádzajúcej odpovede odporúčam použiť Data write(to:options:) API namiesto FileManager createFile(atPath:contents:attributes:), pretože ide o rozhranie API založené na adrese URL, čo jevšeobecne sa uprednostňujú pred tými, ktoré sú založené na ceste. Metóda Data tiež vyvolá chybu namiesto toho, aby sa vracala nesprávne, ak zlyhá, takže ak sa niečo pokazí, môžete používateľovi povedať prečo.

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

Navrhoval by som aj nahradenie trasy FileManager.fileExists(atPath:) pomocou adresy URL checkResourceIsReachable():

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