Рабочий пример 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