開發人員常為圖方便在 HTML 中使用絕對路徑(如 `/project/images/logo.png`),導致離線預覽失效、部署至虛擬目錄時路徑錯誤。需要工具批次轉換為相對路徑(如 `../images/logo.png`)。
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FilePathTool
{
class FilePath
{
static readonly string RootLocal = @"F:\workfolder\project\";
List files = new List();
public FilePath()
{
DirectoryInfo root = new DirectoryInfo(RootLocal);
GetFolders(root, 0, "");
DealFile();
Console.WriteLine($"處理完成,共 {files.Count} 個檔案");
Console.Read();
}
void GetFolders(DirectoryInfo root, int level, string path)
{
foreach (DirectoryInfo dir in root.GetDirectories())
GetFolders(dir, level + 1, path + dir.Name + "/");
foreach (FileInfo file in root.GetFiles())
{
files.Add(new FileItem
{
Level = level,
Name = file.Name,
Extension = file.Extension,
Path = file.FullName,
AbsolutePath = path
});
}
}
void DealFile()
{
foreach (FileItem item in files)
{
if (item.Extension.Equals(".htm", StringComparison.OrdinalIgnoreCase) ||
item.Extension.Equals(".html", StringComparison.OrdinalIgnoreCase))
{
DealReplace(item);
}
}
}
void DealReplace(FileItem item)
{
string content = File.ReadAllText(item.Path, Encoding.Default);
content = ReplaceProcess(content, item);
File.WriteAllText(item.Path, content, Encoding.Default);
}
string ReplaceProcess(string text, FileItem model)
{
foreach (FileItem target in files)
{
string absPath = target.AbsolutePath + target.Name;
if (text.Contains(absPath))
text = ReplaceSingle(text, absPath, target, model);
}
return text;
}
string ReplaceSingle(string text, string absPath, FileItem target, FileItem model)
{
if (target.AbsolutePath == model.AbsolutePath)
return text.Replace("/" + absPath, target.Name); // 同層:移除路徑
else
return text.Replace("/" + absPath, GetDeep(model.Level) + absPath); // 不同層:加上 ../
}
string GetDeep(int level)
{
string s = "";
for (int i = 0; i < level; i++) s += "../";
return s;
}
}
class FileItem
{
public int Level { get; set; }
public string Name { get; set; }
public string Extension { get; set; }
public string Path { get; set; }
public string AbsolutePath { get; set; }
}
}
}