0

我正在尝试从 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”,并将其复制到对话框窗口中的选定路径。

4

1 回答 1

0

对于大多数用途来说,字符串是最差的数据类型。在无法避免使用它们的地方,至少尝试使用能做正确事情的工具。GetDirectoryName返回:

在大多数情况下,此方法返回的字符串由路径中的所有字符组成,直到但不包括最后一个 DirectorySeparatorChar

这意味着如果您直接将文件名连接到它的末尾,您最终会得到一个以 结尾的路径LastDirectoryNamepdftk.exe,这可能不存在。

Path.Combine是一种专门设计用于将路径连接在一起并使目录分隔符正确的方法。


你的FileCopyPath变量似乎特别没有意义。它需要FileCopy, 这是 a Stringand... 调用ToString()它,并将结果存储为 a String。你期望这能达到什么目的?

同样的,SelectedPath的属性FolderBrowserDialog已经是一个字符串了,为什么还要调用ToString()它呢?


我希望正确的代码类似于:

System.IO.File.Copy( _
    System.IO.Path.Combine( _
         System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase), _
         "pdftk.exe"), _
    dlgFolder.SelectedPath)
于 2011-08-22T08:09:47.403 回答