Vbscript 在hta文件中使用文件输入元素可防止删除所选文件
如果使用type=file的输入html元素选择文件,则hta程序无法删除该文件 此MVCE可以工作,但不使用“文件”对话框-您必须手动键入文件名:Vbscript 在hta文件中使用文件输入元素可防止删除所选文件,vbscript,delete-file,hta,html-input,Vbscript,Delete File,Hta,Html Input,如果使用type=file的输入html元素选择文件,则hta程序无法删除该文件 此MVCE可以工作,但不使用“文件”对话框-您必须手动键入文件名: 子过程 Set x=CreateObject(“Scripting.FileSystemObject”) MsgBox“这将实际删除”&ini文件.Value x、 DeleteFile.Value MsgBox“see?”&INIFile.Value&“已消失” 设置x=无 端接头 但是这个MVCE不起作用-文件没有被删除;只是推迟到程序退出
子过程
Set x=CreateObject(“Scripting.FileSystemObject”)
MsgBox“这将实际删除”&ini文件.Value
x、 DeleteFile.Value
MsgBox“see?”&INIFile.Value&“已消失”
设置x=无
端接头
但是这个MVCE不起作用-文件没有被删除;只是推迟到程序退出:
子过程
Set x=CreateObject(“Scripting.FileSystemObject”)
MsgBox“尝试手动删除”&ini文件.Value&“(然后撤消它)”
x、 DeleteFile.Value
MsgBox“现在尝试删除文件”&INIFile.Value&(现在在关闭应用程序之前无法删除该文件)
设置x=无
端接头
不知何故,使用文件类型输入html元素可以使文件从程序外部手动删除,直到调用DeleteFile函数为止。DeleteFile函数实际上并没有删除该文件——它只是将删除推迟到hta程序退出——此时该文件最终会删除自身
我需要在程序仍在运行时删除该文件。有没有办法在hta文件中使用文件类型输入html元素,并且在hta程序运行时仍然删除该文件
编辑
我的实际用例!在尝试生成一个可用的MVCE时,我没有意识到会找到一个不符合我特定需求的解决方案
我删除该文件的原因是为了用其他内容替换它,因此我需要在函数结束前将该文件消失<代码>调用window.location.reload()绝对有效,但该文件在函数结束时消失
我实际上想做的是这样的:
子过程
Dim文件:file=ini文件.Value
调用window.location.reload()
'将文件备份到tempfile.tmp
'现在使用所有更改编辑tempfile.tmp并预览它
'然后询问用户对更改是否满意
'删除原始文件
'并将tempfile.tmp放置到位
Dim x:Set x=CreateObject(“Scripting.FileSystemObject”)
x、 CopyFile文件,“tempfile.tmp”
x、 删除文件
MsgBox“为什么“&file&”仍然存在?”
x、 MoveFile“tempfile.tmp”,文件“这将生成”文件“已存在”
设置x=无
端接头
更新:基于
现在我已经亲自测试了这种方法,结果与OP类似,所以我想我会进一步调查
文件句柄似乎在页面的生命周期内保持不变,请尝试以下操作
- 封装在
中,然后调用
方法Reset()
- 清除
属性并使用变量保存文件路径值
子流程
Set x=CreateObject(“Scripting.FileSystemObject”)
MsgBox“尝试手动删除”&ini文件.Value&“(然后撤消它)”
x、 DeleteFile.Value
'重新加载页面
调用window.location.reload()
端接头
这是可行的,显然这对于捕获文件在页面重新加载时被删除的事实并不理想,但是OP没有详细说明他们的要求
您还可以将转到按钮设置为
,并使用OnSubmit
事件调用进程()
,这可能是一种更干净的方法,然后调用window.location.reload()
进一步更新:
通过使用多个文件进行测试,我们注意到,一旦使用
选择了另一个文件,则在释放句柄并将其赋予新选择的文件时,会删除上一个文件
我想知道克隆
元素并删除前一个元素是否会产生相同的效果,从而避免重新加载页面
更新:已经过测试,并且仍然保留文件句柄
是为上传文件而设计的,因此,一旦您选择了一个文件,HTA就会打开一个句柄。也就是说,您没有理由直接调用ini文件
的值,而是将其存储在变量中(毕竟它只是一个字符串),然后清除
的值
属性
子流程
Dim x:Set x=CreateObject(“Scripting.FileSystemObject”)
'从输入获取文件路径
Dim文件:file=ini文件.Value
'重置文件输入
INIFile.Value=“”
MsgBox“这将实际删除”&文件
x、 删除文件
MsgBox“是否查看?”&文件&“已丢失”
设置x=无
端接头
有用的链接
使用常规文本输入框
<input type="text" name="FileName" size="30">
可以根据需要排除或自定义strStartPath、strFilter和strOption变量
FileName.value将包含文件的路径,并且不会被锁定
编辑:
以下是整个HTA,不包括删除文件的代码(我已经用删除代码测试过):
子选择文件
FileName.value=“”
strStartPath=“C:\Test”
strFilter=“Text(*.txt;*.csv)|*.txt;*.csv | VBScript(*.vbs;*.vbc)|*.vbs;*.vbc | HTML(*.htm;*.HTML;*.hta)|*.htm;*.HTML;*.hta |所有文件(*.*)|*
stroption=“选择一个文件”
FileName.value=Dlg.openfiledlg(CStr(strStartPath)、CStr(strFilter)、CStr(stroption))
'此时可以删除FileName.value处的文件。
端接头
如果设置ini文件.Value会发生什么
<input type="button" onClick="SelectFile" value="Browse...">
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B" width=0 height=0>
Sub SelectFile
FileName.value = ""
strStartPath = "C:\Test"
strFilter = "Text (*.txt;*.csv)| *.txt;*.csv|VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|All Files (*.*)|*.*|"
strCaption = "Select a File"
FileName.value = Dlg.openfiledlg(CStr(strStartPath), , CStr(strFilter), CStr(strCaption))
End Sub
<html>
<HEAD>
<HTA:APPLICATION
APPLICATIONNAME="Select File"
ID="SelectFileApplication"
VERSION="1.0"/>
<SCRIPT Language="VBScript">
Sub SelectFile
FileName.value = ""
strStartPath = "C:\Test"
strFilter = "Text (*.txt;*.csv)| *.txt;*.csv|VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|All Files (*.*)|*.*|"
strCaption = "Select a File"
FileName.value = Dlg.openfiledlg(CStr(strStartPath), , CStr(strFilter), CStr(strCaption))
'The file at FileName.value can be deleted at this point.
End Sub
</SCRIPT>
</HEAD>
<body id="body">
<input type="text" name="FileName" size="30">
<input type="button" onClick="SelectFile" value="Browse...">
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B" width=0 height=0>
</body>
</html>