cnvictor 发表于 2012-5-2 23:57:43

FileOpen函数如何以独占方式打开文件?

本帖最后由 cnvictor 于 2012-5-2 23:59 编辑

FileOpen函数如何以独占方式打开文件,即当前的Autoit在写一个文件的同时,禁止其他程序打开并读写此文件?

3mile 发表于 2012-5-3 09:28:59

#include <GuiEdit.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global $sFile, $hFile, $sText, $nBytes, $tBuffer

GUICreate("api func", 400, 300)
$iMemo = GUICtrlCreateEdit("测试文件独占模式中,退出程序时释放文件"&@CRLF&"测试文件为"&@DesktopDir & '\abc.txt', 2, 2, 394, 296, BitOR($ES_AUTOVSCROLL, $ES_READONLY))
GUISetState()

$sFile = @DesktopDir & '\abc.txt'
$sText = 'abcdefghijklmnopqrstuvwxyz'
$tBuffer = DllStructCreate("byte[" & StringLen($sText) & "]")
DllStructSetData($tBuffer, 1, $sText)
$hFile = _WinAPI_CreateFile($sFile, 1,4,0)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), StringLen($sText), $nBytes)


Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_CloseHandle($hFile)
GUIDelete()

1007236046 发表于 2012-5-3 16:49:59

$sText里面如果含有中文字符会丢失最后的部分字符

3mile 发表于 2012-5-4 11:51:57

$sText里面如果含有中文字符会丢失最后的部分字符
1007236046 发表于 2012-5-3 16:49 http://www.autoitx.com/images/common/back.gif
1.DllStructCreate中'byte'指8bit(1字节) 带符号字符(signed char),但汉字ANSI使用的是(16bit)双字节字符,如果不改变数据类型的话,可将字符串转换成2进制ANSI写入.代码如下:
#include <GuiEdit.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global $sFile, $hFile, $sText, $nBytes, $tBuffer

GUICreate("api func", 400, 300)
$iMemo = GUICtrlCreateEdit("测试文件独占模式中,退出程序时释放文件"&@CRLF&"测试文件为"&@DesktopDir & '\abc.txt', 2, 2, 394, 296, BitOR($ES_AUTOVSCROLL, $ES_READONLY))
GUISetState()

$sFile = @DesktopDir & '\abc.txt'
$sText = '测试894(04#$%文件独占模式中,退出程fdjka序时释放文件'
$sText_Bin=Binary(StringToBinary($sText))
$sText_Bin_Len=BinaryLen(Binary(StringToBinary($sText)))
$tBuffer = DllStructCreate("byte[" & $sText_Bin_Len & "]")
DllStructSetData($tBuffer, 1, $sText_Bin)
$hFile = _WinAPI_CreateFile($sFile, 1,4,0)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), $sText_Bin_Len, $nBytes)


Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_CloseHandle($hFile)
GUIDelete()



2.也可将数据类型改成WCHAR 16bit(2字节) UNICODE 宽字符(Wide char) ,但TXT文件默认用的ANSI编码(简体中文系统下,ANSI 编码代表GB2312 编码),WriteFile写入文件的时候,默认Unicode编码,比如“你”就是4F60,TXT文件打开的时候会认为是ANSI编码,产生乱码,但是如果中间英文或者数字的话,比如"a你",就变成00614F60,这样的话系统就会认为是Unicode编码,打开不会有乱码。变通的办法就是将Unicode编码转换成ANSI,即将宽字符转换成多字节字符.代码如下:
#include <GuiEdit.au3>
#include <WinAPI.au3> ; used for Lo/Hi word
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global $sFile, $hFile, $sText, $nBytes, $tBuffer

GUICreate("api func", 400, 300)
$iMemo = GUICtrlCreateEdit("测试文件独占模式中,退出程序时释放文件"&@CRLF&"测试文件为"&@DesktopDir & '\abc.txt', 2, 2, 394, 296, BitOR($ES_AUTOVSCROLL, $ES_READONLY))
GUISetState()

$sFile = @DesktopDir & '\abc.txt'
$sText = '测试文件独占模式中kfdasfdasfdas退出程序时释放文件'
$Len=StringLen($sText)
$tBuffer = DllStructCreate("wchar[" & $Len & "]")
DllStructSetData($tBuffer, 1, $sText)
$pBuffer=_WinAPI_WideCharToMultiByte(DllStructGetPtr($tBuffer), 0, False);将UNICODE转换成ANSI

$hFile = _WinAPI_CreateFile($sFile, 1,4,0)
_WinAPI_WriteFile($hFile, DllStructGetPtr($pBuffer), DllStructGetSize($pBuffer), $nBytes)


Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_CloseHandle($hFile)
GUIDelete()

页: [1]
查看完整版本: FileOpen函数如何以独占方式打开文件?