2010-07-09 20 views
2

我在我的sql數據庫中有產品表。每個產品都有一個圖像和4個縮略圖。這些只是將圖像的文件名存儲在硬盤上。我遇到的問題是,隨着時間的推移,我刪除了數千種產品,但圖像仍保留在硬盤上。刪除SQL數據庫中不存在的圖像

現在我需要建立一個腳本(在C#.NET),以消除任何孤立的圖像。我認爲唯一的方法是將產品列表存入內存,然後循環目錄中的所有圖像以交叉引用,如果不存在,請將其刪除。

有沒有人碰到這個之前來和你能給我什麼建議?

+0

一旦清理完畢,向業務層添加一些邏輯以保持同步,這將是一個不錯的主意。 – 2010-07-09 14:35:54

回答

9

更快的方法是編寫一個過程,將的所有圖像都引用到同一硬盤上的新文件夾。然後,一旦你確認你已經將他們全部刪除(或者如果你感到緊張時重命名)舊文件夾,並最終將新文件夾重新命名爲原始名稱。

您應該先備份原始文件夾,以防萬一。

+1

+1一個不錯的主意! – 2010-07-09 13:56:59

+0

這是一個很好的想法,因爲數據庫中的圖像可能比文件系統中的孤立圖像少。只需獲取所有產品並將其圖像複製到另一個文件夾中即可。謝謝! – markvpc 2010-07-09 14:03:52

+1

在這種情況下不會移動圖像而不是複製它們會更快? – Jeroen 2010-07-09 14:06:11

0

一個想法浮現在腦海:你能以某種標誌,你需要的圖片? 以最基本的方式,您可以暫時將它們重命名爲允許說used_xxx.jpg

然後草率地循環您的文件夾並刪除所有沒有used_前綴的圖像。 之後,您將仍然存在的圖像重命名爲其原始名稱。

編輯:這樣你就不必複製任何東西。你有一個視覺參考,所以你可以看到你在做什麼。

+0

我喜歡這種方式不會複製圖像(因爲硬盤不是那麼大),但我仍然認爲通過所有文件循環可能不是刪除它們的最佳方法。謝謝。 – markvpc 2010-07-09 14:06:11

0

這真的是你做到這一點的唯一方法。我建議先對數據庫中的產品圖像進行迭代,然後用它們的名稱和路徑構建一個List<string>,然後使用Directory對象在圖像目錄中遞歸列出所有圖像(如有必要)。

然後通過每個文件在返回的信息,但你List<string>比較。如果它不在列表中,請將其從文件系統中刪除。

記得備份一下,以防萬一!

0

你似乎有幾乎回答了你自己的問題......而不是遍歷目錄,你可以遍歷所有數據庫中的產品,並且每個產品的圖像複製到一個新文件夾中的所有圖像,但它的幾乎相同的事情。

0

如果你熟悉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 
+0

謝謝,這可能是一個很好的解決方案,直接從數據庫,而不是建立一個腳本。 – markvpc 2010-07-09 14:39:22