.NET を使用して「NTFS 代替データ ストリーム」を読み取り、変更するにはどうすればよいですか?
それに対するネイティブの.NETサポートはないようです。どの Win32 API を使用しますか? また、これは文書化されていないと思うので、どのように使用しますか?
.NET を使用して「NTFS 代替データ ストリーム」を読み取り、変更するにはどうすればよいですか?
それに対するネイティブの.NETサポートはないようです。どの Win32 API を使用しますか? また、これは文書化されていないと思うので、どのように使用しますか?
これがC#のバージョンです
using System.Runtime.InteropServices;
class Program
{
static void Main(string[] args)
{
var mainStream = NativeMethods.CreateFileW(
"testfile",
NativeConstants.GENERIC_WRITE,
NativeConstants.FILE_SHARE_WRITE,
IntPtr.Zero,
NativeConstants.OPEN_ALWAYS,
0,
IntPtr.Zero);
var stream = NativeMethods.CreateFileW(
"testfile:stream",
NativeConstants.GENERIC_WRITE,
NativeConstants.FILE_SHARE_WRITE,
IntPtr.Zero,
NativeConstants.OPEN_ALWAYS,
0,
IntPtr.Zero);
}
}
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
);
}
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 サポートはありません。ネイティブの Win32 メソッドを呼び出すには、P/Invoke を使用する必要があります。
それらを作成するには、のようなパスでCreateFilefilename.txt:streamname
を呼び出します。SafeFileHandle を返す相互運用呼び出しを使用する場合は、それを使用して、読み書きできる FileStream を作成できます。
ファイルに存在するストリームを一覧表示するには、FindFirstStreamWとFindNextStreamWを使用します(これらは Server 2003 以降にのみ存在し、XP には存在しません)。
ファイルの残りの部分をコピーしてストリームの 1 つを残す以外に、ストリームを削除できるとは思いません。長さを 0 に設定することもできますが、試したことはありません。
ディレクトリに代替データ ストリームを設定することもできます。ファイルと同じようにアクセスします - C:\some\directory:streamname
.
ストリームには、デフォルト ストリームとは関係なく、圧縮、暗号化、およびスパース性を設定できます。
この nuget パッケージの CodeFluent ランタイム クライアントには、(他のユーティリティの中でも)作成/読み取り/更新/削除/列挙操作をサポートするNtfsAlternateStream クラスがあります。
.NET にはありません:
http://support.microsoft.com/kb/105763
#include <windows.h>
#include <stdio.h>
void main( )
{
HANDLE hFile, hStream;
DWORD dwRet;
hFile = CreateFile( "testfile",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
0,
NULL );
if( hFile == INVALID_HANDLE_VALUE )
printf( "Cannot open testfile\n" );
else
WriteFile( hFile, "This is testfile", 16, &dwRet, NULL );
hStream = CreateFile( "testfile:stream",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
0,
NULL );
if( hStream == INVALID_HANDLE_VALUE )
printf( "Cannot open testfile:stream\n" );
else
WriteFile(hStream, "This is testfile:stream", 23, &dwRet, NULL);
}