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でありString、... を呼び出しToString()、結果を として保存し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 に答える