Удалить изображения, которых нет в базе данных SQL - PullRequest
2 голосов
/ 09 июля 2010

У меня есть таблица продуктов в моей базе данных sql.Каждый продукт имеет изображение и 4 миниатюры.Они просто хранят имя файла изображения на жестком диске.У меня проблема в том, что со временем я удалил тысячи продуктов, но изображения все еще остаются на жестком диске.

Теперь мне нужно создать скрипт (в c # .net) для удаления любых потерянных изображений.Я предполагаю, что единственный способ состоит в том, чтобы получить список продуктов в памяти и зациклить, хотя все изображения в каталоге для перекрестной ссылки и удаления, если они не существуют.дайте мне какой-нибудь совет?

Ответы [ 5 ]

9 голосов
/ 09 июля 2010

Более быстрый способ - написать процедуру, которая перемещает все образы, на которые ссылаются в новую папку на том же жестком диске. Затем, как только вы убедились, что у вас есть все, удалите (или переименуйте, если вы нервничаете) старую папку и, наконец, переименуйте новую в исходное имя.

Сначала на всякий случай следует сделать резервную копию исходной папки.

0 голосов
/ 09 июля 2010

Если вы вообще знакомы с PowerShell, это похоже на то, что было бы неплохо сделать. Вот способ сделать это в T-SQL, если ваш SQL-сервер MS SQL Server и у вас есть права на запуск xp_cmdshell. Я только что написал это, чтобы не было проверки ошибок и т. Д.

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 голосов
/ 09 июля 2010

Вы, кажется, в значительной степени ответили на свой вопрос ... Вместо того, чтобы перебирать все изображения в каталоге, вы можете перебирать все продукты в базе данных, и для каждого продукта копировать изображение в новую папку, но это довольнопочти то же самое.

0 голосов
/ 09 июля 2010

Это действительно единственный способ сделать это.Я бы предложил сначала пройтись по изображениям продуктов в базе данных и создать List<string> с их именами и путями, а затем использовать объект Directory, чтобы получить список всех изображений, рекурсивно при необходимости, в каталоге изображений.*

Затем просмотрите каждый файл в возвращенном списке и сравните его с вашим List<string>.Если его нет в списке, удалите его из файловой системы.

Не забудьте создать резервную копию, на всякий случай!

0 голосов
/ 09 июля 2010

В голову приходит идея: можете ли вы как-то пометить изображения, которые вам нужны?Самым простым способом вы могли бы временно переименовать их, скажем, used_xxx.jpg

Затем курсивно зациклить ваши папки и удалить все изображения, которые не имеют префикса used_.После этого вы переименовываете все еще существующие изображения в их исходные имена.

Редактировать: Таким образом, вам не нужно ничего копировать.И у вас есть визуальная справка, чтобы вы могли видеть, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...