首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 靜態頁面絕對路徑批次轉相對路徑工具

     編輯:關於ASP.NET

問題情境

開發人員常為圖方便在 HTML 中使用絕對路徑(如 `/project/images/logo.png`),導致離線預覽失效、部署至虛擬目錄時路徑錯誤。需要工具批次轉換為相對路徑(如 `../images/logo.png`)。

解決方案:Console 應用程式遞迴掃描並替換

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; }
 }
 }
}

演算法邏輯

  1. 遞迴掃描專案目錄,建立所有檔案清單(含層級、相對路徑)。
  2. 針對 `.htm/.html` 檔案,掃描內容中出現的其他檔案絕對路徑。
  3. 計算來源檔案與目標檔案的相對深度差,產生正確的 `../` 前綴。
  4. 同層檔案直接使用檔名;子目錄檔案保留相對路徑;父層檔案加上 `../`。

擴充建議

  • 支援 `.aspx`、`.ascx`、`.master`、`.js`、`.css` 等檔案類型。
  • 使用正則表達式精準匹配 `src="..."`、`href="..."`、`url(...)` 等屬性值,避免誤替換文字內容。
  • 加入乾跑模式,預覽變更不寫入。
  • 整合至建置流程或 CI/CD Pipeline 自動執行。

注意事項

  • 備份原始碼再執行,替換不可逆。
  • 編碼統一使用 `Encoding.Default` 或偵測檔案編碼(UTF-8 with BOM 等)。
  • 網站採用 `` 或 URL Rewrite 時,相對路徑計算基準不同,需調整演算法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved