初始化filestream时,参数句柄怎么获得?最好能提供一个例子,谢谢!

解决方案 »

  1.   

    using System;
    using System.IO;
    using System.Runtime.InteropServices;namespace copytest
    {
     /// <summary>
     /// FileAccess 的摘要说明。
     /// </summary>
     public class OpenFileApi
     {  private const uint GENERIC_READ = 0x80000000; 
      private const uint GENERIC_WRITE = 0x40000000;  private const int CREATE_NEW = 1;
      private const int CREATE_ALWAYS = 2;
      private const int OPEN_EXISTING = 3;
      private const int OPEN_ALWAYS = 4;  private const int FILE_SHARE_READ = 0x1;
      private const int FILE_SHARE_WRITE = 0x2;  private const uint FILE_ATTRIBUTE_READONLY = 0x1;
      private const uint FILE_ATTRIBUTE_HIDDEN = 0x2;
      private const uint FILE_ATTRIBUTE_SYSTEM = 0x4;
      private const uint FILE_ATTRIBUTE_DIRECTORY = 0x10;
      private const uint FILE_ATTRIBUTE_ARCHIVE = 0x20;
      private const uint FILE_ATTRIBUTE_NORMAL = 0x80;
      private const uint FILE_ATTRIBUTE_TEMPORARY = 0x100;
      private const uint FILE_ATTRIBUTE_COMPRESSED = 0x800;
      private const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
      private const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;  private const int INVALID_HANDLE_VALUE = -1;  private int filehandle;  //声明API的语句。(关键!)
      [DllImport("kernel32.dll")]
      private static extern int CreateFile
      (
       string lpFileName, //File name
       uint dwDesiredAccess, //Access mode
       int dwShareMode, //Share mode
       int lpSecurityAttributes, //SD
       int dwCreationDisposition, //How to create
       uint dwFlagsAndAttributes, //File attributes
       int hTemplateFile //Handle to template file
      );  [DllImport("kernel32.dll")]
      private static extern bool CloseHandle
      (
       int hObject //Handle to object
      );
      public OpenFileApi()
      {
       filehandle=INVALID_HANDLE_VALUE;
       nobuffermode=false;
      }  ~OpenFileApi()
      {
       Close();
      }  public FileStream Open(String filepath,FileMode mode, FileAccess access,FileShare share)
      {
       uint dwDesiredAccess;  //Access mode
       int dwShareMode;   //Share mode
       int lpSecurityAttributes; //SD
       int dwCreationDisposition; //How to create
       uint dwFlagsAndAttributes; //File attributes   if (filehandle != INVALID_HANDLE_VALUE)
       {
        CloseHandle(filehandle);
       }   switch (access)
       {
        case FileAccess.Read:
         dwDesiredAccess=GENERIC_READ;
         break;
        case FileAccess.Write:
         dwDesiredAccess=GENERIC_WRITE;
         break;
        default:
         dwDesiredAccess=GENERIC_READ | GENERIC_WRITE;
         break;
       }   switch (share)
       {
        case FileShare.Read:
         dwShareMode=FILE_SHARE_READ;
         break;
        case FileShare.Write:
         dwShareMode=FILE_SHARE_WRITE;
         break;
        case FileShare.ReadWrite:
         dwShareMode=FILE_SHARE_READ | FILE_SHARE_WRITE;
         break;
        default:
         dwShareMode=0;
         break;
       }   switch (mode)
       {
        case FileMode.Open:
         dwCreationDisposition=OPEN_EXISTING;
         break;
        case FileMode.OpenOrCreate:
         dwCreationDisposition=OPEN_ALWAYS;
         break;
        case FileMode.CreateNew:
         dwCreationDisposition=CREATE_NEW;
         break;
        default: 
         dwCreationDisposition=CREATE_ALWAYS;
         break;
       }   lpSecurityAttributes=0;
          dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL;   filehandle=CreateFile(filepath,
         dwDesiredAccess,
         dwShareMode,
         lpSecurityAttributes,
         dwCreationDisposition,
         dwFlagsAndAttributes,
         0);   if (filehandle != INVALID_HANDLE_VALUE)
       {
        FileStream newfs = new FileStream((IntPtr)filehandle,access);
        return(newfs);
       }
       else
       {
        throw new Exception("File cannot open.");
        //return(null);
       }
      }  public void Close()
      {
       if (filehandle!=INVALID_HANDLE_VALUE)
       {
        CloseHandle(filehandle);
        filehandle=INVALID_HANDLE_VALUE;
       }
      }
     }
    }
      

  2.   

    不可能得到一个尚未创建的文件流的句柄的
    1.先创建文件获取句柄
     handleValue = CreateFile(Path, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
    2.通过文件创建文件流
    fileStream = new FileStream(fileName, FileMode.Create);