Пользовательские свойства файла

Мне нужно следующее:

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

Я пытался использовать OleDocumentProperties из DSOFile, используя следующий код, но безуспешно:

 // Adding custom properties to file (Parameters: FileName, custom property name, value, debug: true/false
 DocumentProperties.WriteDocumentProperty(filename, "dms_dossiernummer", _dossiernummer.ToString(), false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_zaaknaam", ReturnZaaknaam(_dossiernummer), false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_verantw_medew", ReturnVerantwMedew(_dossiernummer), false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_document_path", path, false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_bestandsnaam", bestandsNaam, false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_bestands_id", bestandId, false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_is_checkedout", "true", false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_dossier_map_id", dossierMapId, false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_bestand_versie_nummer", Queries.Dms.Selects.GetDocumentVersion(
                                                        Convert.ToInt32(bestandId)).ToString(), false);
 DocumentProperties.WriteDocumentProperty(filename, "dms_bestands_locatie", path, false);

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

Ответ 1

Что такое файл?

В принципе, файл представляет собой просто поток байтов и некоторые метаданные, ассоциированные с файловой файловой системой. В ранних файловых системах метаданные были в основном просто именем файла и некоторыми штампами. Более новые файловые системы, такие как NTFS, могут добавлять дополнительные метаданные.

Откуда возникают свойства документа?

В проводнике Windows вы можете увидеть довольно много свойств документа для многих типов файлов. Приятный унифицированный интерфейс предполагает наличие единого хранилища свойств. Это не так. Обозреватель Explorer имеет расширяемый интерфейс для Обработчики свойств свойств, которые извлекают эту информацию из разных типов файлов. Существует обработчик файлов JFIF (JPEG), а также есть обработчики для файлов OLE (старые форматы Office) и новые форматы Office.

Где я должен помещать свои метаданные?

Вывод:

  • Если вы можете гарантировать, что вам нужно только обрабатывать определенные форматы файлов, исследуйте добавление метаданных в файлы. Например,

    • Свойства OLE, если все ваши файлы представляют собой документы Office старого стиля (.doc)

    • Используя Open XML API, если все ваши документы являются документами Office нового типа (.docx)

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

  • В противном случае вы должны создать собственное хранилище данных. Сопутствующие файлы - очевидная возможность; вы можете хранить метаданные в базе данных; или вы можете создать один файл в каталоге для хранения всех метаданных для файлов в этом каталоге. Подумайте, можете ли вы столкнуться с проблемами concurrency с несколькими запросами на один и тот же файл. Использование базы данных может упростить работу с этим.

Ответ 2

Альтернативный поток данных позволит вам хранить любые данные, которые вы хотите. Осторожно; если вы скопируете файл в файловую систему NTFS, дополнительные данные будут удалены.

Здесь - статья, которая должна вас запустить

- Редактировать 1/2/2014 -
Вот еще несколько: http://www.codeproject.com/Articles/2670/Accessing-alternative-data-streams-of-files-on-an http://www.dreamincode.net/forums/topic/90666-reading-and-writing-alternate-streams-in-c%23/ NTFS Alternate Data Streams -.NET

И один для создания/просмотра ADS из командной строки: http://www.undermyhat.org/blog/2012/05/copy-delete-or-rename-alternate-data-streams-using-only-standard-windows-command-prompt-tools/

Ответ 3

Хотя любой вид файла можно открыть с помощью DSOFile.dll, пользовательские свойства не будут сохраняться, кроме файлов, которые являются OLE Structured Storages/Ole Documents (http://en.wikipedia.org/wiki/COM_Structured_Storage), как более старые форматы файлов Microsoft Office (.doc,.xls и т.д.) и некоторые файлы САПР.

Как писал Брэд, вы можете использовать альтернативные потоки данных, но у него также есть зависимость файловой системы NTFS.

Я не рекомендую вам идти этими путями...

Что делать, если вы использовали новый файл, т.е. <original file>.props или такой?

Ответ 4

Здесь есть несколько вариантов.

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

Вы можете просто написать свои пользовательские свойства как JSON, XML, сериализованные объекты или даже простой формат строки + разделителя.

К сожалению, они не полностью доступны с использованием .NET, вы должны использовать P/Invoke и CreateFile.

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true )]
    private static extern SafeFileHandle CreateFile(
          string lpFileName,
          uint dwDesiredAccess,
          uint dwShareMode,
          IntPtr SecurityAttributes,
          uint dwCreationDisposition,
          uint dwFlagsAndAttributes,
          IntPtr hTemplateFile
          );

Затем вам необходимо создать поток данных с файловым путем, за которым следует двоеточие, за которым следует имя потока в качестве имени файла и передать SafeFileHandle, возвращаемый CreateFile, в конструктор FileStream. Все остальные опции CreateFile являются нормальными для открытия файла через этот API.

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

Здесь ссылка для CreateFile. http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

Вот некоторые полезные константы:

    private  const    uint     GENERIC_WRITE                 = 0x40000000;
    private  const    uint     GENERIC_READ                  = 0x80000000;

    private  const    uint     FILE_SHARE_READ               = 0x00000001;
    private  const    uint     FILE_SHARE_WRITE              = 0x00000002;

    private  const    uint     CREATE_NEW                    = 1;
    private  const    uint     CREATE_ALWAYS                 = 2;
    private  const    uint     OPEN_EXISTING                 = 3;
    private  const    uint     OPEN_ALWAYS                   = 4;

Метод, который не требует P/Invoke и дружелюбен к файловым системам, отличным от NTFS, заключается в создании второго файла с полным именем пути к исходному файлу + добавленному добавленному добавлению. Опять же, вы можете использовать свой предпочтительный метод хранения свойств в этом файле. Однако это имеет тот недостаток, что если ваш пользователь перемещает файлы, они также должны перемещать свойства.

Ответ 5

Наконец-то я нашел простой способ поместить свойства документа в документы Word.

Просто используя DSOFile.dll:)

Работает как шарм!