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