CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, SA, CREATE_ALWAYS, 0, 0)
定义了一个sa结构,SA指向它
我第二个参数和第三个参数搞不懂 -.-
share mode 和access mode之间的关系是什么啊?
前面使用过的createfile函数没出错
这个跟前面的有什么关系呢?
3x!

解决方案 »

  1.   

    你的函数什么怎么是怪怪的????Private Declare Function CreateFile Lib "kernel32" _
       Alias "CreateFileA" _
      (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
       ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, _
       ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
       ByVal hTemplateFile As Long) As Long
    【操作系统】
    Win9X:Yes
    WinNT:Yes【说明】  这是一个全功能的例程,可打开和创建文件、管道、邮槽、通信服务、设备以及控制台 【返回值】  Long,如执行成功,则返回文件句柄。INVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYS 
      或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS 【其它】  打开一个通信端口时(如COM1),无论如何都要设置成
      OPEN_EXISTING
      这个函数代替了lOpen 和 lCreate函数,应该是我们的首选【参数表】
      lpFileName -----  String,要打开的文件的名字  dwDesiredAccess -  Long,如果为 GENERIC_READ
      表示允许对设备进行读访问;如果为 GENERIC_WRITE
      表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息  dwShareMode ----  Long,零表示不共享; FILE_SHARE_READ 和/或
      FILE_SHARE_WRITE 表示允许对文件进行共享访问  lpSecurityAttributes -  SECURITY_ATTRIBUTES,指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)  dwCreationDisposition -  Long,下述常数之一:
      CREATE_NEW
      创建文件;如文件存在则会出错
      CREATE_ALWAYS
      创建文件,会改写前一个文件
      OPEN_EXISTING
      文件必须已经存在。由设备提出要求
      OPEN_ALWAYS
      如文件不存在则创建它
      TRUNCATE_EXISTING
      讲现有文件缩短为零长度  dwFlagsAndAttributes -  Long,一个或多个下述常数
      FILE_ATTRIBUTE_ARCHIVE
      标记归档属性
      FILE_ATTRIBUTE_COMPRESSED
      将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
      FILE_ATTRIBUTE_NORMAL
      默认属性
      FILE_ATTRIBUTE_HIDDEN
      隐藏文件或目录
      FILE_ATTRIBUTE_READONLY
      文件为只读
      FILE_ATTRIBUTE_SYSTEM
      文件为系统文件
      FILE_FLAG_WRITE_THROUGH
      操作系统不得推迟对文件的写操作
      FILE_FLAG_OVERLAPPED
      允许对文件进行重叠操作
      FILE_FLAG_NO_BUFFERING
      禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
      FILE_FLAG_RANDOM_ACCESS
      针对随机访问对文件缓冲进行优化
      FILE_FLAG_SEQUENTIAL_SCAN
      针对连续访问对文件缓冲进行优化
      FILE_FLAG_DELETE_ON_CLOSE
      关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
      也可在Windows NT下组合使用下述常数标记:
      SECURITY_ANONYMOUS, SECURITY_IDENTIFICATION,
      SECURITY_IMPERSONATION, SECURITY_DELEGATION, SECURITY_CONTEXT_TRACKING,
      SECURITY_EFFECTIVE_ONLY
      hTemplateFile --  Long,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
      

  2.   

    看看这个实例先:'Example Name:Files
    'This program needs a Dialog box, named CDBox1
    '  (To add the Common Dialog Box to your tools menu, go to Project->Components (or press CTRL-T)
    '   and select Microsoft Common Dialog control)
    Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
    Private Type SHFILEOPSTRUCT
        hWnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAborted As Boolean
        hNameMaps As Long
        sProgress As String
    End Type
    Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
    End Type
    Private Const GENERIC_WRITE = &H40000000
    Private Const OPEN_EXISTING = 3
    Private Const FILE_SHARE_READ = &H1
    Private Const FILE_SHARE_WRITE = &H2
    Private Const FO_DELETE = &H3
    Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
    Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As Long) As Long
    Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
    Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
    Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
    Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
    Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
    Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
    Private Sub Form_Load()
        'KPD-Team 1998
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long
        Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME
        'Set the dialog's title
        CDBox.DialogTitle = "Choose a file ..."
        'Raise an error when the user pressed cancel
        CDBox.CancelError = True
        'Show the 'Open File'-dialog
        CDBox.ShowOpen
        'Create a new directory
        CreateDirectory "C:\KPD-Team", ByVal &H0
        'Copy the selected file to our new directory
        CopyFile CDBox.filename, "C:\KPD-Team\" + CDBox.FileTitle, 0
        'Rename the file
        MoveFile "C:\KPD-Team\" + CDBox.FileTitle, "C:\KPD-Team\test.kpd"
        'Open the file
        lngHandle = CreateFile("C:\KPD-Team\test.kpd", GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
        'Get the file's size
        MsgBox "The size of the selected file is" + Str$(GetFileSize(lngHandle, lngLong)) + " bytes."
        'Get the fil's time
        GetFileTime lngHandle, Ft1, Ft1, Ft2
        'Convert the file time to the local file time
        FileTimeToLocalFileTime Ft2, Ft1
        'Convert the file time to system file time
        FileTimeToSystemTime Ft1, SysTime
        MsgBox "The selected file was created on" + Str$(SysTime.wMonth) + "/" + LTrim(Str$(SysTime.wDay)) + "/" + LTrim(Str$(SysTime.wYear))
        'Close the file
        CloseHandle lngHandle
        'Delete the file
        DeleteFile "C:\KPD-Team\test.kpd"
        With SHDirOp
            .wFunc = FO_DELETE
            .pFrom = "C:\KPD-Team"
        End With
        'Delete the directory
        SHFileOperation SHDirOp
        End
    End Sub
      

  3.   

    我用的是vb.net,不能用 byval 0&
    所以一开始定义了一个 SA结构,如下:
    <StructLayout(LayoutKind.Sequential)> Public Structure SECURITY_ATTRIBUTES
            Private nLength As Integer
            Private lpSecurityDescriptor As Integer
            Private bInheritHandle As Integer
        End Structure
    然后    dim sa as SECURITY_ATTRIBUTES
    当时我也有一点疑惑,因为这里并没有对里面每一个成员赋值
    不过在其他用这个没问题的,就没有深究
    这个参数和access mode,share mode 有什么关系?
      

  4.   

    .net中用api倒是还没有试过dwDesiredAccess -  Long,如果为 GENERIC_READ
      表示允许对设备进行读访问;如果为 GENERIC_WRITE
      表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
      

  5.   

    这些意思我都基本了解
    就是他们之间的关系搞不清楚
    msdn里面有个表,就是讲access跟share的关系的,看不大懂 -.-
    还有可能跟SA有关,跟前面已经用过了的createfile函数有关
    蛮复杂的样子
      

  6.   

    create_always 这个函数不好用,我改成create_new 就行了
    只是这样不能覆盖了