Error al usar rutas largas en .net 4.7

He configurado Enable Win32 Long Paths en el Editor de políticas de grupo local en Enabled y reinicié la computadora.

Y aquí está el código:

 string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); for (int i = 0; i < 10; i++) path += "\\" + new string('z', 200); Directory.CreateDirectory(path); 

Estoy recibiendo el error:

System.IO.DirectoryNotFoundException: ‘No se pudo encontrar una parte de la ruta’ C: \ Users … \ Desktop \ zzzzzzzzzz …

(Que es en realidad un extraño mensaje de error).

app.config ya tiene:

  

Más información (probablemente no es importante)

Intenté agregar como se menciona en esta publicación y en otra parte (aunque como se señala en los comentarios, no es necesario cuando se usa .net 4.7) en app.config bajo configuration :

    

Sigue siendo el mismo error.

Si solo uso un zzzzzz... lo crea en el escritorio sin error.

Estoy usando VS2017, Windows 10. Probé Winforms y WPF.

La actualización de aniversario (RS1) tiene un error que permite que las rutas largas funcionen sin el manifiesto. Para cualquier ventana actualizada, debe agregar el elemento Archivo de manifiesto de aplicación a su proyecto. De lo contrario, no funcionará.

   true   

Es posible que esto no responda a su pregunta, pero le ofrezca una sugerencia para una solución. Probé tu fragmento con mono 4.5 en Ubuntu Linux y funciona como un encanto, pero en Windows la historia podría ser un poco diferente. Aquí, el culpable parece ser el .NET Framework, en relación con este artículo y este otro artículo , no es compatible con las rutas largas.

Por lo tanto, la solución que sugiere @Anastasiosyal en esta respuesta de StackOverflow es confiar en la API de Windows. Hay dos maneras: desvío directo o llamada Api.

 Directory.CreateDirectory(@"\\?\" + veryLongPath); 

Api llamada (el código no es mío, lo obtuve de @Anastasiosyal respuesta):

 // This code snippet is provided under the Microsoft Permissive License. using System; using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; [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; // 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); } } 

Además, te aconsejo que uses Path.Combine lugar de path + "\\" + subpath .