UweKeim / ZetaLongPaths

A .NET library to access files and directories with more than 260 characters length.

Home Page:https://nuget.org/packages/ZetaLongPaths

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ZetaLongPaths can't move files from long source path on Windows Server 2012

Pawel-Durzynski opened this issue · comments

There is an exception when ZetaLongPaths moves files from long source path on Windows Server 2012. Operating system is up to date. Source path + name of file limit is 256 chars, after this length the problem starts to occur.

Method:

ZlpIOHelper.MoveFile(source, destination);

Exception:

System.ComponentModel.Win32Exception (0x80004005): Error 123 moving file '\\?\C:\Program Files (x86)\xxxx.txt' to '\\?\D:\xxxxx.txt': The filename, directory name, or volume label syntax is incorrect.
at ZetaLongPaths.ZlpIOHelper.MoveFile(String sourceFilePath, String destinationFilePath, Boolean overwriteExisting) in c:\P\ZetaLongPaths\Source\RuntimeNetCore\ZlpIOHelper.cs:line 489

Is there any solution to this problem?

I've tested on both Windows Server 2012 and Windows Server 2012 R2.

In both cases, I did not succeed in generating the error. Everything worked as expected.

Can you assemble a MCVE/SSCCE so I can reproduce the error here?

My own example was:

var f1 = new ZlpFileInfo(
    @"C:\Ablage\test-only\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Lalala.txt");
f1.Directory.Create();
f1.WriteAllText("lalala.");
Console.WriteLine("f1.Length: " + f1.Length);

var f2 = new ZlpFileInfo(
    @"D:\Ablage\test-only\Ablage2\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Lalala.txt");
f2.Directory.Create();

f1.MoveTo(f2, true);
Console.WriteLine("f2.Length: " + f2.Length);

new ZlpDirectoryInfo(@"C:\Ablage\test-only\").Delete(true);
new ZlpDirectoryInfo(@"D:\Ablage\test-only\").Delete(true);

(currently discussing via email with Pawel; I will post the results here later on)

Hi @UweKeim

Found an issue, but can't tell if this is bug or feature. Here you have repro code (notice double \ in f2 path) :

var f1 = new ZlpFileInfo(
@"C:\Ablage\test-only\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Lalala.txt");
f1.Directory.Create();
f1.WriteAllText("lalala.");
Console.WriteLine("f1.Length: " + f1.Length);

        var f2 = new ZlpFileInfo(
            @"D:\Ablage\test-only\Ablage2\Ablage\Ablage\Ablage\\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Ablage\Lalala.txt");
        f2.Directory.Create();

        f1.MoveTo(f2, true);
        Console.WriteLine("f2.Length: " + f2.Length);

        new ZlpDirectoryInfo(@"C:\Ablage\test-only\").Delete(true);
        new ZlpDirectoryInfo(@"D:\Ablage\test-only\").Delete(true);

I think it is a bug, when I shorten the f2 path to: D:\Ablage\test-only\Ablage2\Ablage\\Ablage\LalalaD.txt moving file is working fine.

Hello UweKeim,

I can admit that there is a bug with double backslashes reported by email. There is no need to discuss via email :)

Besta regardss,
Pawel

There is some inconsistence:

  1. When moving file to destination path that is short and contains \\ - this works.
  2. When moving file to destination path that is long and contains \\ - this do not work.

I think this should work the same whether path is long or short.
If \\ is legal in path it should work in short and long path.
If \\ is illegal in paths it should not work in both short and long paths.

I can't tell how to fix this in code. I managed to fix our internal code to not to generate \\ in paths.

Since I'm primarily forwarding my method calls to PInvoke Win32 API calls, and I'm not sure about all the file path formats out there possible, I do not dare to implement validity checking logic inside my library.

Instead, I do prefer to let the PInvoke call fail since this is the most accurate checking about whether a path is valid or invalid.

I do hope you understand.

Yes, fine, until there is a workaround I'm happy :)