53

.NET を使用して「NTFS 代替データ ストリーム」を読み取り、変更するにはどうすればよいですか?

それに対するネイティブの.NETサポートはないようです。どの Win32 API を使用しますか? また、これは文書化されていないと思うので、どのように使用しますか?

4

5 に答える 5

33

これが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;
}
于 2009-03-03T03:29:26.857 に答える
16

それらに対するネイティブの .NET サポートはありません。ネイティブの Win32 メソッドを呼び出すには、P/Invoke を使用する必要があります。

それらを作成するには、のようなパスでCreateFilefilename.txt:streamnameを呼び出します。SafeFileHandle を返す相互運用呼び出しを使用する場合は、それを使用して、読み書きできる FileStream を作成できます。

ファイルに存在するストリームを一覧表示するには、FindFirstStreamWFindNextStreamWを使用します(これらは Server 2003 以降にのみ存在し、XP には存在しません)。

ファイルの残りの部分をコピーしてストリームの 1 つを残す以外に、ストリームを削除できるとは思いません。長さを 0 に設定することもできますが、試したことはありません。

ディレクトリに代替データ ストリームを設定することもできます。ファイルと同じようにアクセスします - C:\some\directory:streamname.

ストリームには、デフォルト ストリームとは関係なく、圧縮、暗号化、およびスパース性を設定できます。

于 2009-03-03T05:04:34.617 に答える
15

この nuget パッケージの CodeFluent ランタイム クライアントには、(他のユーティリティの中でも)作成/読み取り/更新/削除/列挙操作をサポートするNtfsAlternateStream クラスがあります。

于 2013-01-23T08:59:11.080 に答える
4

.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);
   }
于 2009-03-03T03:14:49.920 に答える