删除SQL数据库中不存在的图像

时间:2010-07-09 13:50:54

标签: c# sql file directory

我的sql数据库中有一个产品表。每个产品都有一个图像和4个缩略图。这些只是将图像的文件名存储在硬盘上。我遇到的问题是,随着时间的推移,我删除了数千种产品,但图像仍保留在硬盘上。

现在我需要构建一个脚本(在c#.net中)来删除任何孤立的图像。我假设唯一的方法是将产品列表放入内存并循环通过目录中的所有图像进行交叉引用,如果它们不存在则删除。

有没有人遇到过这个问题,你能给我任何建议吗?

5 个答案:

答案 0 :(得分:9)

更快捷的方法是编写一个过程,将所有 引用的图像移动到同一硬盘上的新文件夹中。然后,一旦你确认你已经将它们全部删除(或者如果你感到紧张则重命名)旧文件夹,最后将新文件重命名为原始名称。

您应首先备份原始文件夹,以防万一。

答案 1 :(得分:0)

想到一个想法:你能以某种方式标记你需要的图像吗? 在最基本的方式中,您可以临时重命名它们,比如used_xxx.jpg

然后大肆循环你的文件夹并删除所有没有used_前缀的图像。 之后,将现有图像重命名为原始图像。

编辑:这样你就不必复制任何东西了。你有一个视觉参考,所以你可以看到你在做什么。

答案 2 :(得分:0)

这真的是你唯一能做到的。我建议首先遍历数据库中的产品图像并使用它们的名称和路径构建List<string>,然后使用Directory对象在图像中按需递归地提取所有图像的列表。目录

然后浏览返回列表中的每个文件,并将其与List<string>进行比较。如果列表中不存在,请将其从文件系统中删除。

请记住备份,以防万一!

答案 3 :(得分:0)

您似乎已经回答了自己的问题...而不是遍历目录中的所有图像,您可以迭代数据库中的所有产品,并且每个产品都将图像复制到新文件夹,但它很漂亮同样的事情。

答案 4 :(得分: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