防止在 .NET 上构建路径中的反斜杠以进行跨平台部署
Preventing backslash in path building on .NET for cross platform deploy
我有一个遗留的 .NET 应用程序,我已经移植到 .NET 6.0 并且正在执行跨平台(Windows & Linux)。
许多遗留代码是通过硬编码路径创建开发的,在字符串中使用反斜杠,例如
new StreamWriter(FeuxBarreFolderName + @"\JazzSchmazz.txt");
我已经转换成
new StreamWriter(Path.Combine(FeuxBarreFolderName, "JazzSchmazz.txt"));
我想防止任何开发人员无意或有意地再次在硬编码路径中添加 \。除了在代码审查时处理这个问题之外,有没有一种方法可以让我自动执行此操作,无论是通过代码分析还是在测试时出现严重的失败?我的搜索没有帮助。
我的想法
- 在我的 Docker 集成测试中修改 ext4 文件系统以防止文件名带有 \.我不知道这是否可能/合理。
- 在我的 Docker 集成测试中获得创意,以防止在根目录中创建文件(从父目录中删除 w),但允许它子目录(再次将 w 添加到特定的子目录)。这感觉超级脆。
- 查找或编写分析器来查看字符串并抱怨任何包含 \ 字符的字符串。
这里有更好的方法吗?
由于在开发或执行时没有内置的方法来防止这种情况,我将在集成测试后将此代码添加到 运行。如果发现任何使用不当字符(反斜杠)创建的文件或目录,它将扫描文件系统并抛出异常。
我也想添加一个冒号检查,以防人们创建像“c:\feux\barre.txt”这样的路径,但看起来至少 NuGet 会创建带有冒号的目录(例如 ~/.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");
});
}
我有一个遗留的 .NET 应用程序,我已经移植到 .NET 6.0 并且正在执行跨平台(Windows & Linux)。
许多遗留代码是通过硬编码路径创建开发的,在字符串中使用反斜杠,例如
new StreamWriter(FeuxBarreFolderName + @"\JazzSchmazz.txt");
我已经转换成
new StreamWriter(Path.Combine(FeuxBarreFolderName, "JazzSchmazz.txt"));
我想防止任何开发人员无意或有意地再次在硬编码路径中添加 \。除了在代码审查时处理这个问题之外,有没有一种方法可以让我自动执行此操作,无论是通过代码分析还是在测试时出现严重的失败?我的搜索没有帮助。
我的想法
- 在我的 Docker 集成测试中修改 ext4 文件系统以防止文件名带有 \.我不知道这是否可能/合理。
- 在我的 Docker 集成测试中获得创意,以防止在根目录中创建文件(从父目录中删除 w),但允许它子目录(再次将 w 添加到特定的子目录)。这感觉超级脆。
- 查找或编写分析器来查看字符串并抱怨任何包含 \ 字符的字符串。
这里有更好的方法吗?
由于在开发或执行时没有内置的方法来防止这种情况,我将在集成测试后将此代码添加到 运行。如果发现任何使用不当字符(反斜杠)创建的文件或目录,它将扫描文件系统并抛出异常。
我也想添加一个冒号检查,以防人们创建像“c:\feux\barre.txt”这样的路径,但看起来至少 NuGet 会创建带有冒号的目录(例如 ~/.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");
});
}