为了账号安全,请及时绑定邮箱和手机立即绑定

NTFS备用数据流-.NET

/ 猿问

NTFS备用数据流-.NET

慕村225694 2019-09-21 14:55:29

如何从.NET创建/删除/读取/写入/ NTFS备用数据流?

如果没有本机.NET支持,我将使用哪个Win32 API?另外,由于我认为没有记载,我将如何使用它们?


查看完整描述

3 回答

?
慕斯709654

不在.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);

   }


查看完整回答
反对 回复 2019-09-21
?
冉冉说

这是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;

}


查看完整回答
反对 回复 2019-09-21
?
慕标琳琳

没有对它们的本机.NET支持。您必须使用P / Invoke来调用本地Win32方法。


要创建它们,请使用路径调用CreateFilefilename.txt:streamname。如果您使用返回SafeFileHandle的互操作调用,则可以使用该互操作构造一个FileStream,然后可以对其进行读写。


要列出文件上存在的流,请使用FindFirstStreamW和FindNextStreamW(它们仅在Server 2003和更高版本上存在,而在XP上不存在)。


我不相信您可以删除流,除非复制文件的其余部分并保留其中一个流。将长度设置为0也许也可以,但是我还没有尝试过。


您还可以在目录上具有备用数据流。您访问它们的方式与使用文件-相同C:\some\directory:streamname。


可以对流设置压缩,加密和稀疏性,而与默认流无关。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信