Рабочий пример C#: запись и чтение альтернативного потока данных NTFS под 64-битной Win7

Я хотел бы иметь возможность использовать альтернативный поток данных для хранения некоторой информации о синхронизации для файлов, на которые есть ссылки в приложении базы данных, которое я создаю.

Тем не менее, каждый подход, который я нашел в Интернете, так или иначе потерпел неудачу. Не имея опыта программирования на Win32 API, я не уверен, почему происходят сбои. В некоторых случаях вызовы методов кажутся успешными, только альтернативный поток не создается (то есть, я не могу позже прочитать из альтернативного файла, и AlternateStreamViewer не может его увидеть). В других случаях запись завершается успешно, но чтение завершается неудачно, потому что вызов CreateFile() приводит к неверному SafeFileHandle.

На данный момент я просто хотел бы найти некоторый рабочий код. Или имейте в виду, что "ты не можешь добраться отсюда". В этом случае я воспользуюсь другим, менее привлекательным вариантом (например, закодирую информацию синхронизации / ссылки в самом имени файла и надеюсь, что никто никогда не изменит имя файла).


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

Тем не менее, вы правы, что это помогло бы, так как оказалось, что я использовал один из подходов - метод Trinet, упомянутый ниже - неправильно. Я думаю, проблема была в том, что я еще не создал "базовый" файл, для которого я пытался сохранить альтернативный поток.

Вот ссылки на кодовые базы, которые я пробовал:

2 ответа

Решение

Я добился успеха на Windows 7 x64 с использованием этой библиотеки:

https://github.com/hubkey/Trinet.Core.IO.Ntfs

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

Изменить: видимо это так просто, как:

using Trinet.Core.IO.Ntfs;

var fileInfo = new FileInfo(@"C:\path\to\file.dat");
if (AlternateDataStreamExists("MyStreamName"))
{
    var alternateStream = fileInfo.GetAlternateDataStream("MyStreamName").OpenRead();
}
else
{
    var alternateStream = fileInfo.GetAlternateDataStream("MyStreamName").OpenWrite();
}

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

https://github.com/platformdotnet/Platform.VirtualFileSystem/wiki https://github.com/platformdotnet/Platform.VirtualFileSystem/wiki/Alternate-Data-Streams

Другие вопросы по тегам