我有一個已移植到 .NET 6.0 并正在執行跨平臺(Windows 和 Linux)的遺留 .NET 應用程式。
許多遺留代碼是通過硬編碼路徑創建開發的,在字串中使用反斜杠,例如
new StreamWriter(FeuxBarreFolderName @"\\JazzSchmazz.txt");
我已經轉換成類似的東西
new StreamWriter(Path.Combine(FeuxBarreFolderName, "JazzSchmazz.txt"));
我想防止任何開發人員意外或故意在硬編碼路徑中再次添加 \。除了在代碼審查中處理這個問題之外,有沒有一種方法可以讓我通過代碼分析或測驗時的嚴重失敗來自動執行此操作?我的搜索沒有幫助。
我有過的想法
- 在我的 Docker 集成測驗中修改 ext4 檔案系統,以防止檔案名帶有 \. 我不知道這是否可能/合理。
- 在我的 Docker 集成測驗中獲得創造性的權限,以防止在根目錄中創建檔案(從父目錄中洗掉 w),但允許在子目錄中創建檔案(再次將w添加到特定的子目錄)。這感覺超級脆。
- 查找或撰寫一個分析器來查看字串并抱怨任何包含 \ 字符的字串。
這里有更好的方法嗎?
uj5u.com熱心網友回復:
由于在開發或執行時沒有內置的方法來防止這種情況,我將添加此代碼以在我的集成測驗之后運行。如果它發現任何使用不適當字符(反斜杠)創建的檔案或目錄,它將掃描檔案系統并拋出例外。
我還想添加對冒號的檢查,以防人們創建像“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");
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450032.html
