Accessing files beyond MAX_PATH in C#/.NET

前端 未结 5 1410
粉色の甜心
粉色の甜心 2020-12-16 20:56

BACKGROUND

I need to write a tool using .NET version 2.0 at highest (using something off the shelf is not an option for this client for political, c

相关标签:
5条回答
  • 2020-12-16 21:24

    It should be fairly easy to work around this limitation with a bit of platform invoke, assuming your software has the necessary permissions:

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
      uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
      uint dwFlagsAndAttributes, IntPtr hTemplateFile);
    
    // Must close/dispose handle separately from FileStream since it's not owned by
    // that object when passed to constructor.
    using (SafeFileHandle h = CreateFile(longUncPath, GENERIC_WRITE, 0, IntPtr.Zero, 
           OPEN_EXISTING, 0, IntPtr.Zero))
    {
        using (var fs = new FileStream(h, FileAccess.Read))
        {
            // operations with FileStream object
        }
    }
    
    0 讨论(0)
  • 2020-12-16 21:31

    You could try shortening the path by mapping a parent directory using subst.exe (or whatever APIs it uses internally):

    http://www.makeuseof.com/tag/how-to-map-a-local-windows-folder-to-a-drive-letter/

    Ideally you'd map away as much as possible of the path.

    0 讨论(0)
  • 2020-12-16 21:34

    The BCL team did a 3 part series on exactly why these choices were made and what the work arounds are. If you haven't read that yet I suggest you do as it's a great source of information on the subject

    • http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx
    0 讨论(0)
  • 2020-12-16 21:37

    I ran into one third-party solution that may help: AlphaFS.

    0 讨论(0)
  • 2020-12-16 21:40

    I have had success deleting directory structures using below small script. pushd uses UNC format which gives you 32K instead of 260 limitation

    set "folder=\\SERVER\SHARE\DIVISION\DEPARTMENT\NAME OF TEAM - COULD BE FAIRLY LONG\" 
    pushd "%folder%"
    for /d %%i in ("*") do rmdir "%%i" /s /q
    popd
    
    0 讨论(0)
提交回复
热议问题