检测共享目录是否存在或者可用?

feiyafei2008 2009-12-09 04:00:21
高手们!有个问题想问一下:
检测共享目录是否存在或者可用?
如:\\192.168.1.2\XXX
例如:
md \\192.168.1.2\XXX\1
rd \\192.168.1.2\XXX\1
若不能执行能否设置超时之类的
...全文
235 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2009-12-11
  • 打赏
  • 举报
回复
dkfdtf 是这方面的专家。
feiyafei2008 2009-12-10
  • 打赏
  • 举报
回复
如果直接判断某个共享目录是不存在的可能程序会死掉或者停几十秒钟才会有响应。用上面的函数就可以解决了。
feiyafei2008 2009-12-10
  • 打赏
  • 举报
回复
先谢谢了,问题已经解决。
使用进程相关函数解决!用 net 命令如果执行成功就会返回0。
如果直接判断某个共享目录是否存在,可能程序会死掉或者停几十秒钟才会有响应。

?runAndWaitOnRet('net use \\192.168.1.3\xxx', .t.,0.1) &&成功返回0

* 以下函数是“dkfdtf”写的。
function runAndWaitOnRet
lparameters tcCmd, tlHideWindow, tnTimeout
if pCount() < 3 or 'N' <> varType(tnTimeout) or 0 == tnTimeout
tnTimeout = 0
endIf
if pCount() < 2 or 'L' <> varType(tlHideWindow)
tlHideWindow = .f.
endIf

* 创建一个新的进程和主线程,然后在新进程中运行指定的程序
* 返回值:非 0 表示成功,0 表示失败
declare long CreateProcess in win32api ;
string pszImageName, ; && 要执行的模块名或空,为空时以下一个参数的第一个空格前的文件名作为执行模块名
string pszCmdLine, ; && 命令行参数
long psaProcess, ; && 保留,必须为 0
long psaThread, ; && 保留,必须为 0
long fInheritHandles, ; && 保留,必须为 0
long fdwCreate, ; && 进程的优先级和创建方式
long pvEnvironment, ; && 保留,必须为 0
long pszCurDir, ; && 保留,必须为 0
string psiStartInfo, ; && 保留,必须为 0
string @ pProcInfo && 用于接收新进程 Process_Information 结构的缓冲区
* 监控指定的对象,直至该对象处于有信号状态或超时才返回控制给调用进程
declare long WaitForSingleObject in win32api ;
long hHandle, ; && 要监控的对象
long dwMilliseconds && 超时值(毫秒)
* 取指定进程的返回码,非 0 表示成功
declare long GetExitCodeProcess in win32api ;
long hProcess, ; && 进程句柄
long @ lpExitCode && 用于接收返回码
* 关闭指定的系统对象
declare long CloseHandle in win32api long hObject
* 强行终止一个进程及它的所有线程
declare long TerminateProcess in win32api ;
long hProcess, ; && 要关闭的进程句柄
long uExitCode && 指定结束进程的退出码
* 取系统启动以来的毫秒数
declare long GetTickCount in win32api

local lcApiStruSI, lcApiStruPI, lhProcess, lhThread, lnTimeout, lnRetVal

* 创建 CreateProcess API 函数所需的两个结构 StartupInfo, Process_Information
lcApiStruSI = replicate(chr(0), 40) ;
+ binToC(1, 'rs' ) + binToC(iif(tlHideWindow, 0, 1), 'rs') ;
+ replicate(chr(0), 16)
lcApiStruSI = binToC(len(lcApiStruSI)+4, 'rs') + lcApiStruSI
lcApiStruPI = replicate(chr(0), 16)
* 创建新进程,0x20 - NORMAL_PRIORITY_CLASS(普通优先级)
if 0 == CreateProcess( ;
null, tcCmd+chr(0), 0, 0, 0, 0x20, 0, 0, lcApiStruSI, @ lcApiStruPI)
lnRetVal = null && 创建进程失败
else
lhProcess = ctobin(subStr(lcApiStruPI, 1, 4 ), 'rs') && 进程句柄
lhThread = ctobin(subStr(lcApiStruPI, 5, 4 ), 'rs') && 主线程句柄
CloseHandle(lhThread) && 只监视主进程是否终止, 释放主线程引用计数
lnTimeout = iif(tnTimeout == 0, 0, GetTickCount() + tnTimeout * 1000)
do while .t.
inkey(0.2)
lnRetVal = WaitForSingleObject(lhProcess, 0)
if lnRetVal == 0
exit
endIf
if lnTimeout <> 0 and GetTickCount() > lnTimeout
lnRetVal = -1
exit
endIf
endDo
if -1 == lnRetVal
TerminateProcess(lhProcess, -1) && 超时, 强行终止进程
else
GetExitCodeProcess(lhProcess, @ lnRetVal) && 自行退出, 取返回码
endIf
CloseHandle(lhProcess) && 释放进程内核对象的引用计数
endIf
return lnRetVal
endFunc
十豆三 2009-12-09
  • 打赏
  • 举报
回复
If Directory("\\192.168.1.2\XXX",1)
Messagebox("共享目录存在!",64,"信息提示")
lnI=0
Try
Md \\192.168.1.2\XXX\1
Rd \\192.168.1.2\XXX\1
Catch
lnI=1
Endtry
If lnI=1
Messagebox("共享目录存在,并且是只读的!",64,"信息提示")
Else
Messagebox("共享目录存在,并且是可写的!",64,"信息提示")
Endif
Else
Messagebox("共享目录不存在!",48,"信息提示")
Endif

feiyafei2008 2009-12-09
  • 打赏
  • 举报
回复
如果192.168.1.2这个电脑未打开或不存在,可能这个程序就会执行很久才会有响应。
Directory("\\192.168.1.2\XXX",1)
能否设置超时。
wwwwb 2009-12-09
  • 打赏
  • 举报
回复
用捕获错误的方法要简单一些,否则要用API函数,
比较复杂
十豆三 2009-12-09
  • 打赏
  • 举报
回复
至于是否是可写的,可以用你的命令并运用 Try 容错即可。
十豆三 2009-12-09
  • 打赏
  • 举报
回复
If Directory("\\192.168.1.2\XXX",1)
Messagebox("共享目录存在!",64,"信息提示")

Else
Messagebox("共享目录不存在!",48,"信息提示")
Endi

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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