.NET を使用した NTFS 代替データ ストリームの読み取りと変更
NTFS 代替データ ストリーム (ADS) は、通常のファイルに関連付けられた隠しデータ ストリームです。 New Technology File System (NTFS)。これらのストリームは、プライマリ ファイル データに影響を与えることなく、ユーザー コメント、バージョン履歴、マルチメディア コンテンツなどの追加情報を保存するために使用できます。
ADS の読み取り
ADS を読み取る場合は、dwDesiredAccess パラメータを GENERIC_WRITE に設定して CreateFileW 関数を使用できます。これにより、読み取りと書き込みの両方のためにストリームが開きます。その後、ReadFile 関数を使用してストリームの内容を読み取ることができます。
ADS の変更
ADS を変更するには、dwDesiredAccess パラメーターを次のように設定して CreateFileW 関数を使用できます。 GENERIC_WRITE。これにより、読み取りと書き込みの両方のためにストリームが開きます。次に、WriteFile 関数を使用して、新しいコンテンツをストリームに書き込むことができます。
ADS の読み取りと変更方法の C# の例を次に示します。
using System.Runtime.InteropServices; class Program { static void Main(string[] args) { // Open the main file stream var mainStream = NativeMethods.CreateFileW( "testfile", NativeConstants.GENERIC_WRITE, NativeConstants.FILE_SHARE_WRITE, IntPtr.Zero, NativeConstants.OPEN_ALWAYS, 0, IntPtr.Zero); // Open the ADS stream var stream = NativeMethods.CreateFileW( "testfile:stream", NativeConstants.GENERIC_WRITE, NativeConstants.FILE_SHARE_WRITE, IntPtr.Zero, NativeConstants.OPEN_ALWAYS, 0, IntPtr.Zero); // Write data to the ADS stream var data = "Hello world!"; NativeMethods.WriteFile(stream, data, data.Length, out var bytesWritten, IntPtr.Zero); // Close the ADS stream NativeMethods.CloseHandle(stream); // Close the main file stream NativeMethods.CloseHandle(mainStream); } } public partial class NativeMethods { /// Return Type: HANDLE->void* ///lpFileName: LPCWSTR->WCHAR* ///dwDesiredAccess: DWORD->unsigned int ///dwShareMode: DWORD->unsigned int ///lpSecurityAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES* ///dwCreationDisposition: DWORD->unsigned int ///dwFlagsAndAttributes: DWORD->unsigned int ///hTemplateFile: HANDLE->void* [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] public static extern System.IntPtr CreateFileW( [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, [InAttribute()] System.IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, [InAttribute()] System.IntPtr hTemplateFile ); /// Return Type: BOOL->int ///hFile: HANDLE->void* ///lpBuffer: LPVOID->void* ///nNumberOfBytesToWrite: DWORD->unsigned int ///lpNumberOfBytesWritten: LPDWORD->DWORD* ///lpOverlapped: LPOVERLAPPED->_OVERLAPPED* [DllImportAttribute("kernel32.dll", EntryPoint = "WriteFile")] public static extern int WriteFile( System.IntPtr hFile, [InAttribute()] System.IntPtr lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [InAttribute()] System.IntPtr lpOverlapped ); /// Return Type: BOOL->int ///hObject: HANDLE->void* [DllImportAttribute("kernel32.dll", EntryPoint = "CloseHandle")] public static extern int CloseHandle( [InAttribute()] System.IntPtr hObject ); } public partial class NativeConstants { /// GENERIC_WRITE -> (0x40000000L) public const int GENERIC_WRITE = 1073741824; /// FILE_SHARE_DELETE -> 0x00000004 public const int FILE_SHARE_DELETE = 4; /// FILE_SHARE_WRITE -> 0x00000002 public const int FILE_SHARE_WRITE = 2; /// FILE_SHARE_READ -> 0x00000001 public const int FILE_SHARE_READ = 1; /// OPEN_ALWAYS -> 4 public const int OPEN_ALWAYS = 4; }
以上が.NET を使用して NTFS 代替データ ストリームを読み取り、変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。