我在我的sql數據庫中有產品表。每個產品都有一個圖像和4個縮略圖。這些只是將圖像的文件名存儲在硬盤上。我遇到的問題是,隨着時間的推移,我刪除了數千種產品,但圖像仍保留在硬盤上。刪除SQL數據庫中不存在的圖像
現在我需要建立一個腳本(在C#.NET),以消除任何孤立的圖像。我認爲唯一的方法是將產品列表存入內存,然後循環目錄中的所有圖像以交叉引用,如果不存在,請將其刪除。
有沒有人碰到這個之前來和你能給我什麼建議?
我在我的sql數據庫中有產品表。每個產品都有一個圖像和4個縮略圖。這些只是將圖像的文件名存儲在硬盤上。我遇到的問題是,隨着時間的推移,我刪除了數千種產品,但圖像仍保留在硬盤上。刪除SQL數據庫中不存在的圖像
現在我需要建立一個腳本(在C#.NET),以消除任何孤立的圖像。我認爲唯一的方法是將產品列表存入內存,然後循環目錄中的所有圖像以交叉引用,如果不存在,請將其刪除。
有沒有人碰到這個之前來和你能給我什麼建議?
一個想法浮現在腦海:你能以某種標誌,你需要的圖片? 以最基本的方式,您可以暫時將它們重命名爲允許說used_xxx.jpg
然後草率地循環您的文件夾並刪除所有沒有used_前綴的圖像。 之後,您將仍然存在的圖像重命名爲其原始名稱。
編輯:這樣你就不必複製任何東西。你有一個視覺參考,所以你可以看到你在做什麼。
我喜歡這種方式不會複製圖像(因爲硬盤不是那麼大),但我仍然認爲通過所有文件循環可能不是刪除它們的最佳方法。謝謝。 – markvpc 2010-07-09 14:06:11
這真的是你做到這一點的唯一方法。我建議先對數據庫中的產品圖像進行迭代,然後用它們的名稱和路徑構建一個List<string>
,然後使用Directory
對象在圖像目錄中遞歸列出所有圖像(如有必要)。
然後通過每個文件在返回的信息,但你List<string>
比較。如果它不在列表中,請將其從文件系統中刪除。
記得備份一下,以防萬一!
你似乎有幾乎回答了你自己的問題......而不是遍歷目錄,你可以遍歷所有數據庫中的產品,並且每個產品的圖像複製到一個新文件夾中的所有圖像,但它的幾乎相同的事情。
如果你熟悉PowerShell的所有,這似乎是一些東西,這將是善於做。如果您的SQL服務器恰好是MS SQL Server,並且您有權運行xp_cmdshell,則可以在T-SQL中執行此操作。我只是寫了這個,所以它沒有錯誤檢查等。
DECLARE
@image_files TABLE (file_path VARCHAR(MAX))
DECLARE
@file_path VARCHAR(MAX),
@cmd VARCHAR(MAX)
INSERT INTO @image_files (file_path)
EXEC xp_cmdshell 'dir *.jpg /b /s /x'
-- Change the extension if you use GIF, etc.
DECLARE file_cursor CURSOR FOR
SELECT
file_path
FROM
@image_files
WHERE
file_path NOT IN
(
SELECT file_path
FROM
My_Files
)
OPEN file_cursor
FETCH NEXT FROM file_cursor INTO @file_path
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @cmd = 'EXEC xp_cmdshell ''del ' + @file_path + ''''
EXEC(@cmd)
FETCH NEXT FROM file_cursor INTO @file_path
END
CLOSE file_cursor
DEALLOCATE file_cursor
謝謝,這可能是一個很好的解決方案,直接從數據庫,而不是建立一個腳本。 – markvpc 2010-07-09 14:39:22
一旦清理完畢,向業務層添加一些邏輯以保持同步,這將是一個不錯的主意。 – 2010-07-09 14:35:54