Tengo una aplicación .NET heredada que he portado a .NET 6.0 y estoy ejecutando en varias plataformas (Windows y Linux).
Gran parte del código heredado se desarrolló con la creación de rutas codificadas de forma rígida, utilizando una barra invertida en las cadenas, como
new StreamWriter(FeuxBarreFolderName + @"\\JazzSchmazz.txt");que he convertido en algo como
new StreamWriter(Path.Combine(FeuxBarreFolderName, "JazzSchmazz.txt"));Quiero evitar que cualquier desarrollador agregue accidentalmente o deliberadamente \ en una ruta codificada nuevamente. Además de manejar esto en la revisión del código, ¿hay alguna manera de que pueda hacerlo automáticamente, ya sea mediante el análisis del código o una falla espectacular en el momento de la prueba? Mis búsquedas han sido inútiles.
Ideas que he tenido
¿Hay una mejor manera aquí?
Como no hay una forma integrada de protegerse contra esto en el momento del desarrollo o la ejecución, agregaré este código para que se ejecute después de mis pruebas de integración. Barrirá el sistema de archivos y generará una excepción si encuentra archivos o directorios creados con un carácter inapropiado (barra invertida).
También quería agregar una verificación de dos puntos, en caso de que la gente estuviera creando rutas como "c:\feux\barre.txt", pero parece que al menos NuGet crea directorios con dos puntos (por ejemplo, ~/.local/share/NuGet/v3-cache/670c1461c29885f9aa22c281d8b7da90845b38e4$ps:_api.nuget.org_v3_index.json )
void walkTree(System.IO.DirectoryInfo dirInfo, Action<System.IO.FileSystemInfo> action) { try { foreach (var file in dirInfo.GetFiles()) action(file); } catch (System.IO.DirectoryNotFoundException) { } try { foreach (var subdir in dirInfo.GetDirectories()) { action(subdir); walkTree(subdir, action); } } catch (System.UnauthorizedAccessException) { } catch (System.IO.DirectoryNotFoundException) { } catch (System.Security.SecurityException) { } } foreach (var drive in System.Environment.GetLogicalDrives()) { var driveInfo = new System.IO.DriveInfo(drive); if (!driveInfo.IsReady) continue; walkTree(driveInfo.RootDirectory, (FileSystemInfo fi) => { if (fi.Name.Contains('\\')) throw new InvalidOperationException($"'{fi.FullName}' was created with an inappropriate character"); }); }