Vbscript 在hta文件中使用文件输入元素可防止删除所选文件

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不起作用-文件没有被删除;只是推迟到程序退出

如果使用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“现在尝试删除文件”&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()
    方法
  • 清除
    属性并使用变量保存文件路径
这两种方法都不起作用,但在测试过程中,他们意识到,如果在HTA中刷新页面,则会发生文件删除,这意味着强制页面重新加载应该会起作用,因此最终只能这样做


子流程
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>