1

誰でも私を助けてもらえますか?

P/Invokeマネージ .net コードから WINAPI メソッド を実行しようとしました。CreateFile()メソッドは常に false を返します。指定されたパスを 256 未満にすると正常に機能しますが、256 を超えると機能しません。何か間違っている可能性があります。このリンクによると、長さが 256 を超える長いパス ファイルを使用できるはずです。

以下は私が試したコードです:

static void Main(string[] args)
        {
        string path =            @"c:\tttttttttttaaaaaaaaaaaaaaatttttttttttttttaaaaaaaaaaaaaaatttttttttttttttttttttttttttttttaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaattttttttttttttttttaaaaaaaaaaaaaaaaatttttttttttaaaaaaaaaaatttttttaaaaaaaaaaaaaaaaattttttttttttttttttaaaaaaaaaaaaaaaaattttttttttttttaaaaaaaaaaaaaaaaatttttt";

        LongPath.TestCreateAndWrite(path);

        }


    // This code snippet is provided under the Microsoft Permissive License.
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    internal static extern SafeFileHandle CreateFile(
    string lpFileName,
    EFileAccess dwDesiredAccess,
    EFileShare dwShareMode,
    IntPtr lpSecurityAttributes,
    ECreationDisposition dwCreationDisposition,
    EFileAttributes dwFlagsAndAttributes,
    IntPtr hTemplateFile);




public static void TestCreateAndWrite(string fileName) {

    string formattedName = @"\\?\" + fileName;
    //string formattedName = @"\\?\UNC" + fileName;
    // Create a file with generic write access
    SafeFileHandle fileHandle = CreateFile(formattedName, EFileAccess.GenericWrite, 
       EFileShare.None, IntPtr.Zero,  ECreationDisposition.CreateAlways, 0, IntPtr.Zero);

    // Check for errors
    int lastWin32Error = Marshal.GetLastWin32Error();
    if (fileHandle.IsInvalid) {
        throw new System.ComponentModel.Win32Exception(lastWin32Error);
    }

    // Pass the file handle to FileStream. FileStream will close the
    // handle
    using (FileStream fs = new FileStream(fileHandle,
                                    FileAccess.Write)) {
        fs.WriteByte(80);
        fs.WriteByte(81);
        fs.WriteByte(83);
        fs.WriteByte(84);
    }
}

このメソッドは、システム エラー コード (0-499) (Windows) に従ってファイル パスが指定されていないエラー コード 3 をスローします。

どんな助けも非常に高く評価されます。

4

1 に答える 1

3

この\\?\表記では、全長が よりも長いパスを使用できますがMAX_PATH、 によって報告されるコンポーネントごとの制限を尊重する必要がありますGetVolumeInformation。NTFS の場合、コンポーネントあたりの制限は 255 です。つまり、バックスラッシュなしで 255 文字を超えることはできません。

于 2012-12-02T17:26:18.577 に答える