找回密码
 加入
搜索
查看: 2909|回复: 3

[AU3基础] FileOpen函数如何以独占方式打开文件?

[复制链接]
发表于 2012-5-2 23:57:43 | 显示全部楼层 |阅读模式
本帖最后由 cnvictor 于 2012-5-2 23:59 编辑

FileOpen函数如何以独占方式打开文件,即当前的Autoit在写一个文件的同时,禁止其他程序打开并读写此文件?
发表于 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()

评分

参与人数 3金钱 +60 贡献 +13 收起 理由
lixiaolong + 30 + 5 学习了!
xms77 + 30 + 3 学习了~
user3000 + 5 学习了!

查看全部评分

发表于 2012-5-3 16:49:59 | 显示全部楼层
$sText里面如果含有中文字符会丢失最后的部分字符
发表于 2012-5-4 11:51:57 | 显示全部楼层
$sText里面如果含有中文字符会丢失最后的部分字符
1007236046 发表于 2012-5-3 16:49

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贡献 +5 收起 理由
1007236046 + 5 谢谢帮忙

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-20 15:34 , Processed in 0.099582 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表