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

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

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

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


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

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

вот ссылки на базы кода I попробовал:

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();
}

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

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