我正在尝试从VB.NET程序所在的当前工作目录中复制文件(pdftk.exe)。
该文件将从“文件夹对话框浏览器”复制到“选定路径”。
我尝试了这段代码,但似乎无法正常工作
Imports System
Imports System.IO
Public Partial Class MainForm
Dim Hours As Integer
Dim Mins As Integer
Dim Secs As Integer
Dim Time As Integer
Dim nmTime As String
Dim FileCopy As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "pdftk.exe"
Dim FileCopyPath As String = FileCopy.ToString
Public Sub New()
Me.InitializeComponent()
End Sub
Sub Button1Click(sender As Object, e As EventArgs)
If dlgFolder.ShowDialog = Windows.Forms.DialogResult.OK Then
txtPath.Text = dlgFolder.SelectedPath
System.IO.File.Copy(_System.IO.Path.Combine(_System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName.CodeBase,_"pdftk.exe")_,dlgFolder.SelectedPath)
End If
End Sub
Sub DlgFolderHelpRequest(sender As Object, e As EventArgs)
End Sub
Sub TxtPathTextChanged(sender As Object, e As EventArgs)
txtPath.Text = dlgFolder.SelectedPath
txtPath.Show
End Sub
Sub LblCurrTimeClick(sender As Object, e As EventArgs)
End Sub
Sub MainFormLoad(sender As Object, e As EventArgs)
Me.timer1.Interval = 1 * 1000
Me.timer1.Enabled = True
rdMerge.Checked = True
End Sub
Private Sub Timer1Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
Me.lblCurrTime.Text = Now.ToLongTimeString
Dim currTime As String = Now.ToLongTimeString
Dim selTime As String = nmTime
If currTime = selTime Then
If Not (rdSWF.Checked = True) Then
Beep
Dim myProcess As Process
File.Copy("pdfmerge.py", dlgFolder.SelectedPath)
myProcess.Start("pdfmerge.py")
Else
Beep
Dim myProcess As Process
File.Copy("p2f.bat", dlgFolder.SelectedPath)
myProcess.Start("p2f.bat")
End If
End If
End Sub
Sub BtnSetClick(sender As Object, e As EventArgs)
lbl8.Visible = True
nmTime = nmHour.Value.ToString().PadLeft(2,"0") + ":" + nmMin.Value.ToString().PadLeft(2, "0") + ":" + nmSec.Value.ToString().PadLeft(2, "0")
lblST.Text = (nmTime)
lblST.Visible = True
pctBox1.Visible = True
End Sub
Sub BtnSwfClick(sender As Object, e As EventArgs)
Dim myProcess As Process
Beep
File.Copy("p2f.bat", dlgFolder.SelectedPath)
myProcess.Start("p2f.bat")
End Sub
Sub BtnNowClick(sender As Object, e As EventArgs)
Dim myProcess As Process
myProcess.Start("pdfmerge.py")
End Sub
Sub Panel1Paint(sender As Object, e As PaintEventArgs)
End Sub
End Class
尝试执行该代码时,我从调试器中收到以下错误消息:
System.ArgumentException: URI formats are not supported.
at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength)
at System.IO.Path.GetFullPathInternal(String path)
at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
at System.IO.File.Copy(String sourceFileName, String destFileName)
at lgaPDF.MainForm.Button1Click(Object sender, EventArgs e) in C:\Documents and Settings\student3\My Documents\SharpDevelop Projects\lgaPDF\lgaPDF\MainForm.vb:line 29
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at lgaPDF.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
程序应从当前工作目录(程序exe所在的目录)获取“pdftk.exe”,并将其从对话框窗口复制到选定路径。
答案 0 :(得分:0)
字符串是大多数用途中最差的数据类型。在你无法避免使用它们的地方,至少尝试使用做正确事情的工具。 GetDirectoryName返回:
在大多数情况下,此方法返回的字符串包含路径中的所有字符,但不包括最后一个DirectorySeparatorChar
这意味着如果你直接将文件名连接到它的末尾,你最终会得到一个结束LastDirectoryNamepdftk.exe
的路径,这可能不存在。
Path.Combine是一种专门用于将路径连接在一起并使目录分隔符正确的方法。
您的FileCopyPath
变量似乎毫无意义。它需要FileCopy
,String
和... ToString()
,并将结果存储为String
。您对此有何期待?
同样,FolderBrowserDialog
的{{3}}属性已经是字符串,那么为什么要在其上调用ToString()
?
我希望正确的代码类似于:
System.IO.File.Copy( _
System.IO.Path.Combine( _
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase), _
"pdftk.exe"), _
dlgFolder.SelectedPath)