Хранить метаданные вне файла: какой-нибудь стандартный подход в современной Windows?

Мое C# приложение синхронизирует файлы из системы удаленного управления документами с файловой системой.

В системе управления документами есть метаданные (дата последней проверки, секретность, автор...), которые связаны с каждым файлом, но не хранятся ВНУТРИ каждого файла.
Файлы могут быть любыми (bmp, xwd, pdf, неизвестный двоичный файл)

Я хочу сделать эти метаданные видимыми в локальной файловой системе Windows.
Но я не могу хранить метаданные ВНУТРИ каждого файла. Например, изменение секретности файла НЕ должно изменять контрольную сумму файла.

Как лучше хранить эти метаданные?

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

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


person Nicolas Raoul    schedule 01.11.2012    source источник


Ответы (1)


Альтернативные потоки данных — одна из малоизвестных функций NTFS. Цитата со страницы:

C:\test>echo "ADS" > test.txt:hidden.txt

C:\test>dir
 Volume in drive C has no label.
 Volume Serial Number is B889-75DB

 Directory of C:>test

10/22/2003  11:22 AM    

. 10/22/2003 11:22 AM
.. 10/22/2003 11:22 AM 0 test.txt

C:\test> notepad test.txt:hidden.txt

This will open the file in notepad and allow you to edit it and save it.

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

ИЗМЕНИТЬ

Некоторые метаданные (например, автор и название) можно сохранить с помощью Свойства документа OLE. Я не знаю, изменяет ли он сам файл или нет:

private void button1_Click(object sender, EventArgs e)
{
  //This is the PDF file we want to update.
  string filename = @"c:\temp\MyFile.pdf";
  //Create the OleDocumentProperties object.
  DSOFile.OleDocumentProperties dso = new DSOFile.OleDocumentProperties();
  //Open the file for writing if we can. If not we will get an exception.
  dso.Open(filename, false,

    DSOFile.dsoFileOpenOptions.dsoOptionOpenReadOnlyIfNoWriteAccess);
  //Set the summary properties that you want.
  dso.SummaryProperties.Title = "This is the Title";
  dso.SummaryProperties.Subject = "This is the Subject";
  dso.SummaryProperties.Company = "RTDev";
  dso.SummaryProperties.Author = "Ron T.";
  //Save the Summary information.
  dso.Save();
  //Close the file.
  dso.Close(false);
}
person Ilmo Euro    schedule 01.11.2012
comment
Большое спасибо! Второе решение работает только для OLE-файлов, поэтому, полагаю, оно изменяет сам файл, к сожалению... Я создал отдельный вопрос, чтобы решить этот вопрос: stackoverflow.com/questions/13172949/ - person Nicolas Raoul; 02.11.2012