2017-08-14 14 views
0

plistまたはdataを書き込むための一意の名前付き出力ファイルを開きたいが、init(fileURLWithPath :)またはinitのURLルーチン(文字列は:)FileHandleが書き込みアクセスのためにURLを受け入れない

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 showsこのURLのinitルーチンのためのスキームを追加

(ファイルを示しています。//)が、他のようにそれ以外の場合は同じ、と私はたいjuのときにreutrning(-1)を投げる新しいメソッドを好むパスを使用しています。スローされたエラー(2)はENOENT(そのようなエンティティはありません。)です。への書き込みへの書き込み他にどのように取得するのか混乱していますか?サンプルパスは、デスクトップでトリアージを作成するために作成された新しいフォルダです。

答えて

2

存在しないファイルに対してファイルハンドルを作成することはできません。これが原因でENOENTエラーが発生しています。

FileManager createFile(atPath:contents:attributes:)を使用して、ファイルハンドルを作成する直前にファイルを作成します。前の回答とは異なり

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

それはパスベースのものよりも好ましいことが一般的であるURLベースのAPIであるため、私は、代わりにFileManagerののcreateFile(atPath:contents:attributes:)のデータのwrite(to:options:) APIを使用することをお勧めします。 Dataメソッドは、失敗した場合にfalseを返す代わりにエラーをスローします。何か問題が生じた場合は、その理由をユーザーに伝えることができます。私も交換示唆う

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

パスベースでFileManager.fileExists(atPath:) URLベースのcheckResourceIsReachable()

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

+0

まあ、私は、書き込みデータやplistの対フェンスの上に残っていたが、私はこれを念頭に置いておきます、ありがとう! – slashlos

+0

私は、書き込みのためのURLを返すバリアント関数を作成しました。私は提案されたデータ書き込みメソッドを使用できます: 'try data.write(to:fileURL)' – slashlos

関連する問題