tulasi
tulasi

Reputation: 11

invoking WinApi when using long path

Can anyone help me please?

I tried to P/Invoke the WINAPI method from managed .net code. CreateFile() method is always returning false. If I make the given path less than 256 it just works fine but not if greater than 256. I might be doing something wrong . According to this link I should be able to use long path file that is greater than 256 in length.

Below is the code that I tried:

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

This method throws error code 3 which is file path not specified according to System Error Codes (0-499) (Windows).

Any help would be highly appreciable.

Upvotes: 1

Views: 533

Answers (1)

Raymond Chen
Raymond Chen

Reputation: 45172

While the \\?\ notation allows you to use paths whose total length is longer than MAX_PATH, you still have to respect the per-component limit reported by GetVolumeInformation. For NTFS, the per-component limit is 255, which means you are not allowed to go more than 255 characters without a backslash.

Upvotes: 3

Related Questions