C# 使用长路径时调用WinApi

C# 使用长路径时调用WinApi,c#,winapi,pinvoke,createfile,C#,Winapi,Pinvoke,Createfile,有人能帮我吗 我试图从托管.net代码中调用WINAPI方法。 CreateFile()方法总是返回false。如果我将给定的路径设置为小于256,它就可以正常工作,但如果大于256,则无法正常工作。我可能做错了什么。 根据这一点,我应该能够使用长度大于256的长路径文件 下面是我尝试的代码: static void Main(string[] args) { string path = @"c:\tttttttttttaaaaaaaaaaa

有人能帮我吗

我试图从托管.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);
    }
}
此方法引发错误代码3,该错误代码是根据系统错误代码(0-499)(Windows)未指定的文件路径


任何帮助都是非常可观的。

虽然
\\?\
符号允许您使用总长度大于
MAX\u PATH
的路径,但您仍然必须遵守
GetVolumeInformation
报告的每个组件的限制。对于NTFS,每个组件的限制为255,这意味着您不允许在没有反斜杠的情况下超过255个字符。

在这个特定代码示例中,您试图使用长度超过256个字符的路径组件;NTFS对每个路径组件的限制是256个字符(或者可能是255个,我忘了)。“\\?\”前缀有助于长度超过256个字符的路径,但单个路径组件仍限制为255或256个字符。文件夹或文件名基本上不能超过255或256个字符。