Уникальный идентификатор файла [дубликат]

Possible Duplicate:
Unique file identifier in windows

Мне нужно получить уникальный идентификатор для определенных файлов на компьютере, и я натолкнулся только на функцию Win32 GetFileInformationByHandle. Как я могу сделать это с. NET Framework?

Обновление: мне нужен постоянный идентификатор, который не изменится, если файл будет перемещен, обновлен, переименован и т. Д.

Обновление 2: Как это можно сделать с папками?

 M.Babcock12 апр. 2012 г., 20:33
Путь к файлу недостаточно уникален?
 Alexei Levenkov12 апр. 2012 г., 20:34
Если вы объясните, что такое «уникальный идентификатор», Вы имеете в виду, что возможно ответить ... Пока выглядит как хороший кандидат для близких.
 Trent Seed12 апр. 2012 г., 20:35
Мне нужен постоянный UID, перемещение файла, конечно, изменит путь.
 M.Babcock12 апр. 2012 г., 20:41
Это просто ... такого идентификатора не существует.
 BrokenGlass12 апр. 2012 г., 20:42
Затем добавьте слой отображения, который заставляет его выглядеть таким образомfor the user, То, что вы ищете, не существует на уровне файловой системы.

Ответы на вопрос(3)

что формат файла не находится под вашим контролем (в противном случае создайте UUID и сохраните его там).

File Object ID's

NTFS поддерживает идентификаторы объектов на уровне файлов, см.FSCTL_CREATE_OR_GET_OBJECT_ID, Я не использовал их, чтобы иметь возможность рекомендовать их, но мне кажется, что это перспективное исследование.

Как и в случае альтернативных потоков данных (ниже), они могут потеряться при копировании на не-NTFS-носитель ("обычные" карты памяти, CD, DVD, флэш-карты, возможно, даже некоторые USB-диски ...) ). Кроме того, некоторые приложения могут запутаться, когда они воссоздают файл при сохранении.

Distributed Link Tracking Service

Служба отслеживания распределенных ссылок использует идентификаторы файловых объектов для отслеживания ссылок на файлы и восстановления их при перемещении файла.

Для службы отслеживания распределенных ссылок AFAIK необходим контроллер домена для сервера. Опять же, у меня нет практического опыта с этим.

On NTFS, you could also create and store a UUID in an альтернативный поток данных.

Предостережения:

Only available on NTFS, will not "survive" on other file systems One white paper "the future of NTFS" considered killing them, but I fancy the thought there were some other features that could help you (unfortunately, I failed to dig that out) I wouldn't want to create that for thousands of files of unknown origin and purpose. Though they "just work" on the file system level, some applications might mess up.

Some document formats - such as Office - allow пользовательские свойства документа.

Это очевидно ограничено, но аналогичные механизмы могут быть перенастроены и на другие типы файлов. (например, многие форматы изображений позволяют добавлять / переписывать «пользовательские» фрагменты, которые должны игнорироваться читателями)

FileFromID vs. IDFromFile

Все решения, кроме DLTS, разрешают толькоIDFromFile поиск, то есть поиск файла, который был перемещен (или был удален), требует поиска всех потенциальных дисков.

Для DLTS, если нет "прямого API" Кстати, вы можете сохранить ярлык с поддержкой DLTS в папке для конкретного приложения, и ~~ надеяться, что ~~ ожидает, что служба исправит ярлык при перемещении файла.

 12 апр. 2012 г., 21:46
Имейте в виду, что ADS также используется вирусами, поэтому их значения тщательно изучаются антивирусным программным обеспечением (иногда разрушительным).

string GetMD5HashFromFile(string fileName)
{
    FileStream file = new FileStream(fileName, FileMode.Open);
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] retVal = md5.ComputeHash(file);
    file.Close();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < retVal.Length; i++)
    {
        sb.Append(retVal[i].ToString("x2"));
    }
    return sb.ToString();
}

это вернет уникальный идентификатор для каждого файла.

 12 апр. 2012 г., 20:36
-1: md5 не уникален.
 Trent Seed12 апр. 2012 г., 20:36
если файл обновлен, хеш изменится
 12 апр. 2012 г., 20:36
Не изменится ли это, если изменится содержимое файла?
 12 апр. 2012 г., 20:37
конечно, это будет зависеть от ваших потребностей, пожалуйста, добавьте больше информации по вашему вопросу
 12 апр. 2012 г., 20:37
md5 не гарантированно уникален, однако вы смотрите на 16 ^ 32 шансов его репликации. Однако если вы хотите уникальность, тогда md5 - это не ваш ответ, однако он предоставит воспроизводимый ключ для каждого файла, то есть хеш файла будет совпадать с перефразировкой того же файла, но это не то же самое, что уникальность.
Решение Вопроса

Эшли Хендерсон Я скопировал сэтот ответ, Это подразумевает два подхода, которые оба возвращают один и тот же уникальный идентификатор.

public class WinAPI
    {
        [DllImport("ntdll.dll", SetLastError = true)]
        public static extern IntPtr NtQueryInformationFile(IntPtr fileHandle, ref IO_STATUS_BLOCK IoStatusBlock, IntPtr pInfoBlock, uint length, FILE_INFORMATION_CLASS fileInformation);

        public struct IO_STATUS_BLOCK
        {
            uint status;
            ulong information;
        }
        public struct _FILE_INTERNAL_INFORMATION {
          public ulong  IndexNumber;
        } 

        // Abbreviated, there are more values than shown
        public enum FILE_INFORMATION_CLASS
        {
            FileDirectoryInformation = 1,     // 1
            FileFullDirectoryInformation,     // 2
            FileBothDirectoryInformation,     // 3
            FileBasicInformation,         // 4
            FileStandardInformation,      // 5
            FileInternalInformation      // 6
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool GetFileInformationByHandle(IntPtr hFile,out BY_HANDLE_FILE_INFORMATION lpFileInformation);

        public struct BY_HANDLE_FILE_INFORMATION
        {
            public uint FileAttributes;
            public FILETIME CreationTime;
            public FILETIME LastAccessTime;
            public FILETIME LastWriteTime;
            public uint VolumeSerialNumber;
            public uint FileSizeHigh;
            public uint FileSizeLow;
            public uint NumberOfLinks;
            public uint FileIndexHigh;
            public uint FileIndexLow;
        }
  }

  public class Test
  {
       public ulong ApproachA()
       {
                WinAPI.IO_STATUS_BLOCK iostatus=new WinAPI.IO_STATUS_BLOCK();

                WinAPI._FILE_INTERNAL_INFORMATION objectIDInfo = new WinAPI._FILE_INTERNAL_INFORMATION();

                int structSize = Marshal.SizeOf(objectIDInfo);

                FileInfo fi=new FileInfo(@"C:\Temp\testfile.txt");
                FileStream fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);

                IntPtr res=WinAPI.NtQueryInformationFile(fs.Handle, ref iostatus, memPtr, (uint)structSize, WinAPI.FILE_INFORMATION_CLASS.FileInternalInformation);

                objectIDInfo = (WinAPI._FILE_INTERNAL_INFORMATION)Marshal.PtrToStructure(memPtr, typeof(WinAPI._FILE_INTERNAL_INFORMATION));

                fs.Close();

                Marshal.FreeHGlobal(memPtr);   

                return objectIDInfo.IndexNumber;

       }

       public ulong ApproachB()
       {
               WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo=new WinAPI.BY_HANDLE_FILE_INFORMATION();

                FileInfo fi=new FileInfo(@"C:\Temp\testfile.txt");
                FileStream fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite);

                WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo);

                fs.Close();

                ulong fileIndex = ((ulong)objectFileInfo.FileIndexHigh << 32) + (ulong)objectFileInfo.FileIndexLow;

                return fileIndex;   
       }
  }
 Trent Seed13 апр. 2012 г., 00:24
 12 апр. 2012 г., 20:47
Обязательно прочитайте комментарий к ответу относительно известного недостатка.
 Trent Seed12 апр. 2012 г., 23:57
@ebeeb, этот метод отлично работает, спасибо! Как я могу сделать то же самое с папками?

Ваш ответ на вопрос