How to select folder or file in the same window? By MSDN, The Shell.BrowseForFolder
method creates a dialog box that enables the user to select a folder and then returns the selected folder's Folder
object.
Thus, for browse for a file we need to use another method. There exists the native <input ...>
tag with type="file"
attribute. However, using it brings more cons than pros (see 2nd solution below).
In next solution, the Browse for File is achieved by using the HtmlDlgHelper
object - an obscure and poorly documented object that is nevertheless available on all Windows systems... In comparison with <input ...>
tag mentioned above, this solution offers to define both initial location and file type masking.
<HTML>
<HEAD>
<Title>File/Folder Copy B</Title>
<!-- Browse for
- file: based on the HTMLDlgHelper class
registered via C:WindowsSystem32mshtmled.dll
(.OpenFileDlg returns string)
- folder: based on the Shell.BrowseForFolder method
(returns the selected folder's Folder object)
-->
<HTA:APPLICATION
ID=""
APPLICATIONNAME="28632270ym"
SCROLL="no"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
>
<script language="VBScript">
''''''''''''''''''''''''''
''' Global State Variables
''''''''''''''''''''''''''
Dim sStartPath, sStartFile, sFilter, sCaption
sStartPath = "D:Remote"
sStartFile = sStartPath & "
ul"
sFilter = "All Files (*.*)|*.*|" _
& "VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|" _
& "HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|"
sCaption = "Choose a File:"
Sub Window_Onload
self.Focus()
self.moveTo 1, 1
self.ResizeTo 760,400
End Sub
Sub BrForFolder
sBFF = PickFolder(sStartPath)
If not sBFF = "" Then
document.Copy_To_PC.txtfile.value = sBFF
document.Copy_To_PC.OKbuton.value = "Treat folder"
End If
End Sub
Sub BrForFile_onclick
sBFF = Dlg.OpenFileDlg( CStr(sStartFile), , CStr(sFilter), CStr(sCaption))
If not sBFF = "" Then
document.Copy_To_PC.txtfile.value = sBFF
document.Copy_To_PC.OKbuton.value = "Treat file"
End If
End Sub
Function PickFolder(sStartPath)
Dim shell, oFldr
Set shell = CreateObject("Shell.Application")
Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
, &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
'See MSDN "BROWSEINFO structure" for constants
If (Not oFldr Is Nothing) Then
PickFolder = oFldr.Self.Path
Else
PickFolder = ""
End If
Set shell = Nothing
Set oFldr = Nothing
End Function
Sub DoFileOK()
MsgBox document.Copy_To_PC.OKbuton.value _
& " """ & document.Copy_To_PC.txtfile.value & """"
document.Copy_To_PC.txtfile.value = ""
document.Copy_To_PC.OKbuton.value = "Undefined"
End Sub
</script>
</HEAD><BODY>
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B"
width=0 height=0>
</OBJECT>
<FORM name="Copy_To_PC">
<p><b><font size="3">Please select a file or folder.</font></b></p>
<input style="width:600px;" type="text" id="txtfile" name="txtfile" />
<br>
<input type="button" value="Browse for File..." id="BrForFile">
or
<input type="button" value="Browse for Folder..." onClick=BrForFolder()>
<br>
<br>Action
<input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
<br>
<br>Quit:
<input type="button" value="All done" onClick=self.window.close()>
</FORM></BODY></HTML>
2nd solution:
<html>
<head>
<Title>File/Folder Copy A</Title>
<!-- based on <input type="file"> of zero width -->
<HTA:APPLICATION
ID=""
APPLICATIONNAME="28632270my"
SCROLL="no"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
>
<script language = "VBScript">
''''''''''''''''''''''''''
''' Global State Variables
''''''''''''''''''''''''''
sStartPath = "D:Remote"
sFilter = "application/pdf,text/plain"
Sub Window_Onload
self.Focus()
self.moveTo 1, 1
self.ResizeTo 960,400
End Sub
Sub BrForFolder()
sBFF = PickFolder(sStartPath)
If sBFF = "" Then
'do not overwrite .txtfile.value with an empty string
Else
Copy_To_PC.txtfile.value = sBFF
Copy_To_PC.OKbuton.value = "Treat folder"
End If
'NOT possible (security reason): Copy_To_PC.fn_file.value = ""
End Sub
Sub BrForFile()
'??? how to know whether a user has pressed 'Open' or 'Cancel' ???
'http://stackoverflow.com/a/4628563/3439404
'The result of the file dialog is not exposed to the browser.
'
'??? how to set initial working directory???
' and file types??? (MSIE does not care about the accept attribute?)
sBFF = Copy_To_PC.fn_file.value
If sBFF = "" Then
'do not overwrite .txtfile.value with an empty string
Else
Copy_To_PC.txtfile.value = sBFF
Copy_To_PC.OKbuton.value = "Treat file"
End If
End Sub
Function PickFolder(sStartPath)
Dim shell : Set shell = CreateObject("Shell.Application")
Dim oFldr : Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
, &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
'See MSDN "BROWSEINFO structure" for constants
'Shell.BrowseForFolder method: Creates a dialog box that
' enables the user to select a folder and then returns
' the selected folder's Folder object.
If (Not oFldr Is Nothing) Then
PickFolder = oFldr.Self.Path
Else
PickFolder = ""
End If
Set shell = Nothing
Set oFldr = Nothing
End Function
Sub DoFileOK()
MsgBox Copy_To_PC.OKbuton.value _
& " """ & Copy_To_PC.txtfile.value & """"
Copy_To_PC.txtfile.value = ""
Copy_To_PC.OKbuton.value = "Undefined"
End Sub
</script>
</head><body><form name="Copy_To_PC">
<p><b><font size="3">Please select a file or folder.</font></b></p>
<input style="width:600px;" type="text" id="txtfile" name="txtfile" />
<input style="width:0px;" type="file" id="fn_file" name="fn_file"
accept=sFilter onChange=BrForFile() onBlur=BrForFile()>
or
<input type="button" value="...for Folder..." onClick=BrForFolder()>
<br>
<br>Action
<input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
<br>
<br>Quit:
<input type="button" value="All done" onClick=self.window.close()>
</form></body></html>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…