如何知道用Shell的程序是否已读取了某设置文件

lnhsgj 2006-04-08 06:30:56
b.exe 运行时要读取设置文件 c.txt

a.exe 先是创建 c.txt 然后用Shell 执行 b.exe

当b.exe读取 c.txt 完毕后, 删除c.txt

也就是要让用户感觉不到 c.txt的存在.

现在的问题是a.exe 如何知道 b.exe 是否已经读取过 c.txt
...全文
426 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnhsgj 2006-04-25
  • 打赏
  • 举报
回复
谢谢大家,我最后还是用延时的办法.
跟据不同的机器配置,设置不同的延时.
望大家有好的办法后,贴出来,谢谢.
lzheng2001 2006-04-11
  • 打赏
  • 举报
回复
b.exe 在加载这个txt后,跟据txt文件的内容,还要加载很多数据,当所有数据加载完成后才会关闭这个txt文件,这期间是删不掉这个txt的.
===========================================
看来找到关键点了:) 既然b.exe在使用txt文件期间锁住了文件,那么,在a.exe中用timer 定时删除这个txt文件, 直到txt文件能够成功删除.



lnhsgj 2006-04-11
  • 打赏
  • 举报
回复
大家帮下呀,现在卡在这里了.
给个函数或提示建议什么的.
lzheng2001 2006-04-11
  • 打赏
  • 举报
回复
按理说,b完成所有数据的加载后,准会有一些地方有提示吧,比如:状态栏或标题栏上的文字改变,或者弹出提示信息之类, 你就根据这个变动来判断呀
lnhsgj 2006-04-11
  • 打赏
  • 举报
回复
而且在被调程序未关闭前,无法返回主调程序.
lnhsgj 2006-04-11
  • 打赏
  • 举报
回复
我试过了,好象这个也不行呀.
这个的功能是检测被调程序是否运行(或关闭),关闭后返回主调程序,没法知道被调程序是否读过某个文件呀.
szmickylee 2006-04-11
  • 打赏
  • 举报
回复
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'WindowsAPI函数,打开进程
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'WindowsAPI函数,关闭Handle
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
'WindowsAPI函数,等待进程
Const SYNCHRONIZE = &H100000 '调用WindowsAPI函数所使用的常量SYNCHRONIZE
Const INFINITE = &HFFFFFFFF '调用WindowsAPI函数所使用的常量INFINITE


Public Function RunShell(PathName, Optional WindowStyle As VbAppWinStyle) As Double
Dim pId, pHnd

On Error Resume Next
pId = Shell(PathName, WindowStyle)
pHnd = OpenProcess(SYNCHRONIZE, 0, pId)

If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE)
Call CloseHandle(pHnd)
End If
RunShell = pId
End Function

'用RunShell来调用exe,一直到被调用的exe执行完毕后才退出
lzheng2001 2006-04-11
  • 打赏
  • 举报
回复
你上面不是说b.exe会锁定文件的吗? 如果它锁住了,a.exe是不能删除的呀.



lnhsgj 2006-04-11
  • 打赏
  • 举报
回复
关键不知道它读没读.删早了还没读呢
djunny 2006-04-09
  • 打赏
  • 举报
回复
B打开后,A里你去判断c是否存在,如果不存在了,就读取完了。

如果a.exe和b.exe会重复的打开的话(就是软件一直不关,关了B,A又开B的酱子),那就在B里删除C的时候去a里记录下删除,然后a里用一个timer判断那个记录下的东东就知道是否读取完了.

不知道方法行不行。
ljydomybest 2006-04-09
  • 打赏
  • 举报
回复
关键C 是个什么样的设置文件,固定的,还是可变的,还是常修改的,
固定的就最后让B 自己解决,可变的常修改的就做成数库,让B 先读取设置,后运行,程序最后退出时删除还是记录就由你决定了,或是操作中,至于访问库里有权限控制就可以了……
ljydomybest 2006-04-09
  • 打赏
  • 举报
回复
错了了djunny(小段) ,他意思是A可能是他开发的,他生成C,后SHLL执行 B 后在删C……
我觉得你只要最后把程序全封装起来,C 是看不见的,最后删C 就不用了,而B读完C没……也不用管了,B不读完,运行B时,执行相关C 的操作就不能进行,这样可能会出现运行时的错误,用错误处理终止当前操作,直到C读取完成,继续运行……
不过这样不好,最好还是找到读取后在运行B ……可谁又让你用别人的B呢?
lsftest 2006-04-08
  • 打赏
  • 举报
回复
你不如看看b.exe读完配置文件后会有什么动作吧。。。
例如会不会出新窗口、控件的状态是否会改变之类。。。。。。。。。
lv1 2006-04-08
  • 打赏
  • 举报
回复
这样啊,就是说读取的时候不能在文本上做手脚啦....
汗死....有个思路,查这个txt是否在进程中,如果不在就删除,不知道b程序调用txt的时候是否会在进程中,如果能删除,那就是说txt不在进程中,已经释放出来了
lnhsgj 2006-04-08
  • 打赏
  • 举报
回复
不好意思,我没说明白:
这个程序b.exe 不是我开发的,我只能通过修改设置文件的方法要求它完成指定的工作.
我又不想让用户知道这个设置文件的存在.
所以,用前创建,用完就删.
b.exe 启动时要读取很多数据,启动时间较长.机器配置高的1分钟,低的要10分钟.
现在我使用延时的办法,由于用户端机器配置不同,所以总是整不准时间.
lnhsgj 2006-04-08
  • 打赏
  • 举报
回复
我最后要达到的目的是不允许用户修改b.exe的设置选项.
当用户修改设置选择后要求保存时,由于c.txt被删除会提示错误.
lnhsgj 2006-04-08
  • 打赏
  • 举报
回复
b.exe 上的这个textbox控件是可以修改的,而且又击时还会清空其中的文本内容.

通过最后访问时间来判断也不行,创建时间和修改时间都精确到秒,只有访问时间精确到日.
不知道怎么回事,后面的时分秒都没有.
lv1 2006-04-08
  • 打赏
  • 举报
回复
List1.Clear
Open sFileName For Input As #1
Do While (Not EOF(1))
Line Input #1, strTemp
List1.AddItem strTemp
Loop
Close #1
Kill sFileName
主要代码就是上面的东西了,sfilename是文件path和name了,我是读到list里了,记错了,以为读到listview中了
lv1 2006-04-08
  • 打赏
  • 举报
回复
还有个方法,如果设置文件要读的内容不是很多的话,你可以先读到程序中的某个变量或者什么地方存起来,读完就删除文件,根本就不需要判断是否读过啊,我现在就有一个东西,我是需要读一个文本中的东西,很多,而且是不确定长度,只确定格式的数据,我是先把数据读到listview中,读完就删除文件
lzheng2001 2006-04-08
  • 打赏
  • 举报
回复
不要把事情想得太复杂.
a.exe读取完txt文件后,在文件最后加上一行特别标记的字符,表示a已经读了,b.exe就根据最后的这些字符来判断.
加载更多回复(7)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧