Как я могу определить, когда файл был последний раз переименован?

У меня есть программа, которая сравнивает файлы в двух папках. Я хочу обнаружить, если файл был переименован, определяет новейший файл (последний раз переименованный) и обновляет имя на старом файле для соответствия.

Для выполнения этого я проверил бы, чтобы видеть, идентичен ли новейший файл поразрядно старому, и если это, просто переименуйте старый файл для соответствия новому.

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

Я любил бы некоторое свойство как FileInfo. LastModified, но для файлов, которые были переименованы.

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

Какие-либо идеи?

7
задан Ty Norton 5 September 2013 в 12:46
поделиться

5 ответов

Если последовательность XPath обрабатывается с обратной по переднюю сторону, ее проще обрабатывать, например, без корней .//a/b/c... Он также должен поддерживать синтаксис XPath Гордона, хотя я не пытался...

static private XmlNode makeXPath(XmlDocument doc, string xpath)
{
    string[] partsOfXPath = xpath.Split('/');
    XmlNode node = null;
    for (int xpathPos = partsOfXPath.Length; xpathPos > 0; xpathPos--)
    {
        string subXpath = string.Join("/", partsOfXPath, 0, xpathPos);
        node = doc.SelectSingleNode(subXpath);
        if (node != null)
        {
            // append new descendants
            for (int newXpathPos = xpathPos; newXpathPos < partsOfXPath.Length; newXpathPos++)
            {
                node = node.AppendChild(doc.CreateElement(partsOfXPath[newXpathPos]));
            }
            break;
        }
    }

    return node;
}
-121--1103018-

Я получил ту же самую «числовую ошибку или ошибку значения» и обнаружил, что две функции работают вместе:

CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
    v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => v_input_string );
    return v_checksum;
END;

CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
    SELECT  LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) ) 
    INTO    v_hex_value
    FROM    dual;
    return v_hex_value;
END;

Затем вы можете выполнить этот запрос, чтобы получить контрольную сумму:

SELECT md5hex( 'my string smoked your hash' ) FROM dual;

Эта вторая функция делает то же самое, что и выдача инструкции SELECT, предоставленной Bazz для функции, которую вы предоставляете, но я предпочитаю не делать rawToHex -- > меньшее преобразование внутри каждого запроса. Это оставляет слишком много вещей, чтобы потенциально пойти не так каждый раз, когда вы используете запрос. Я думаю, что это может быть и быстрее, так как он компилируется во время создания, а не во время выполнения, но я могу ошибаться в этом.

-121--2917610-

A: По крайней мере, в NTFS можно присоединить альтернативные потоки данных к файлу . При первой синхронизации можно просто прикрепить GUID в ADS к исходным файлам, чтобы пометить их.

B: Если у вас нет доступа на запись к источнику, храните хэши файлов, синхронизированных в целевом репозитории. При изменении источника необходимо только хэшировать исходные файлы и сравнивать их по битам только при столкновении хешей. В зависимости от качества и скорости вашей хеш-функции, это сэкономит вам много времени.

1
ответ дан 7 December 2019 в 18:42
поделиться

Если вы работаете на диске NTFS, вы можете включить журнал изменений , в котором затем можно будет запрашивать такие вещи, как переименование событий. Однако вам нужно быть администратором, чтобы включить его для начала, и он будет использовать дисковое пространство. К сожалению, я не знаю каких-либо конкретных реализаций C # чтения журнала.

1
ответ дан 7 December 2019 в 18:42
поделиться

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

0
ответ дан 7 December 2019 в 18:42
поделиться

Файловые системы обычно не отслеживают это.

Поскольку вы, похоже, работаете в Windows, вы можете использовать GetFileInformationByHandle () . (Извините, я не знаю эквивалента C #.) Вы можете использовать поля «индекс файла» в возвращаемой структуре, чтобы увидеть, имеют ли файлы тот же индекс, что и у того, что вы видели раньше. Имейте в виду, что жесткие ссылки также будут иметь тот же индекс.

В качестве альтернативы вы можете как-то хэшировать содержимое файла.

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

0
ответ дан 7 December 2019 в 18:42
поделиться

Я бы сделал CRC (например, CRC example) (всех?) файлов в двух каталогах, сохранив время последнего обновления со значением CRC, имя файла и т.д. После этого пройдитесь по спискам, находя мач по CRC, а затем используйте значения дат, чтобы решить, что делать.

0
ответ дан 7 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: