none
copyfile 的 BUG RRS feed

  • 一般討論

  • 我爬過文了
    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/6b2c4b8c-55f5-40db-8a22-743245525559

    ================
    微軟範例一
    這個範例會將檔案 Test.txt 複製到目錄 TestFiles2 ,而不覆寫現有檔案。
    My.Computer.FileSystem.CopyFile ("C:\UserFiles\TestFiles\test.txt", "C:\UserFiles\TestFiles2")

    微軟範例二
    將檔案路徑取代為想要在程式碼中使用的路徑。
    這個範例會將檔案 Test.txt 複製到目錄 TestFiles2,並將它重新命名為 NewFile.txt。
    My.Computer.FileSystem.CopyFile ("C:\UserFiles\TestFiles\test.txt", "C:\UserFiles\TestFiles2", "NewFile.txt", FileIO.UICancelOption.DoNothing)


    程式測試條件:
    a. VB.NET 2008 pro
    b. 目的檔案2已經存在


    程式測試結果:
    1.
    My.Computer.FileSystem.CopyFile(檔案1, 路徑)
    My.Computer.FileSystem.CopyFile(檔案1, 路徑, False)
    Error: 無法完成作業,因為目錄已經存在於此路徑

    2.
    My.Computer.FileSystem.CopyFile(檔案1, 檔案2)
    My.Computer.FileSystem.CopyFile(檔案1, 檔案2, False)
    Error: 檔案已經存在。

    3.
    My.Computer.FileSystem.CopyFile(檔案1, 路徑, True)
    Error: 無法完成作業,因為目錄已經存在於此路徑。

    4.
    My.Computer.FileSystem.CopyFile(檔案1, 路徑, 檔案2, True)
    My.Computer.FileSystem.CopyFile(檔案1, 路徑, 檔案2, False)
    Error: 從字串 檔名2 至型別 'Integer' 的轉換是無效的。

    5.
    My.Computer.FileSystem.CopyFile(檔案1, 檔案2, True)
    唯一成功的作法

    結論:
    依照微軟的說明和範例來看 1,2,3,4 都應該要成功才對。
    解決的方法當然是先檢查,再複製。

    已經過了兩年多了,Bug還是存在。

    • 已編輯 oneMan 2009年11月30日 上午 01:05
    2009年11月29日 下午 03:06

所有回覆

  • 依照微軟的說明和範例來看 1,2,3,4 都應該要成功才對。
    解決的方法當然是先檢查,再複製。

    已經過了兩年多了,Bug還是存在。


    怎麼會1,2,3,4都會成功??


    msdn已經說了

    destFileName
    型別:System.String
    檔案的名稱。這不可以是目錄或現有檔案。

    所以1,3,4當然不會成功
    至於2的部份,你都已經把第三個參數設為false了,當然也就不能覆蓋
    2009年11月29日 下午 03:34
  • 怎麼會1,2,3,4都會成功??


    msdn已經說了

    destFileName
    型別:System.String
    檔案的名稱。這不可以是目錄或現有檔案。

    所以1,3,4當然不會成功
    至於2的部份,你都已經把第三個參數設為false了,當然也就不能覆蓋

    依照範例一,二的說明,1,3,4應該要成功。1,3,4 的問題,如果不是範例錯就是程式錯。

    2 的問題是已經設定不覆蓋,執行時就不應該出現錯誤訊息。


    2009年11月29日 下午 08:46
  • Hi,

    關於1、3、4,範例也不算錯,只是舉的不是很好。範例中的第二個參數帶的還是檔名,但是是不含附檔名的檔名。
    而你使用上會有問題,應該是因為你有相同名稱的目錄,造成他無法產生指定的檔案。

    至於2的問題,你設定了不覆蓋,當檔案已經存在時,你不讓他彈錯誤,又不讓他覆蓋。那麼你想要他怎摸處理呢?

    不過看起來好像MSDN上的描述也有點錯誤就是了

    My.Computer.FileSystem.CopyFile 方法

    函式原型如下
    Public Sub CopyFile( _
       ByVal sourceFileName As String, _
       ByVal destinationFileName As String _
    )
    ' -or-
    Public Sub CopyFile( _
       ByVal sourceFileName As String, _
       ByVal destinationFileName As String, _
       ByVal overwrite As Boolean _
    )
    ' -or-
    Public Sub CopyFile( _
       ByVal sourceFileName As String, _
       ByVal destinationFileName As String, _
       ByVal showUI As UIOption _
    )
    ' -or-
    Public Sub CopyFile( _
       ByVal sourceFileName As String, _
       ByVal destinationFileName As String, _
       ByVal showUI As UIOption, _
       ByVal onUserCancel As UICancelOption _
    )

    第二個參數都是檔案位置
    destinationFileName

    String:應複製檔案的目標位置。必要項。


    但是範例卻對不起來

    範例

    這個範例會將檔案 Test.txt 複製到目錄 TestFiles2 ,而不覆寫現有檔案。

    Visual Basic
    My.Computer.FileSystem.CopyFile _
    ("C:\UserFiles\TestFiles\test.txt", _
    "C:\UserFiles\TestFiles2")

    將檔案路徑取代為想要在程式碼中使用的路徑。

    這個範例會將檔案 Test.txt 複製到目錄 TestFiles2,並將它重新命名為 NewFile.txt

    Visual Basic
    My.Computer.FileSystem.CopyFile _
    ("C:\UserFiles\TestFiles\test.txt", _
    "C:\UserFiles\TestFiles2", "NewFile.txt", FileIO.UICancelOption.DoNothing)

    將檔案路徑取代為想要在程式碼中使用的路徑。



    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2009年11月30日 上午 01:06
  • Visual Basic
    My.Computer.FileSystem.CopyFile _
    ("C:\UserFiles\TestFiles\test.txt" , _
    "C:\UserFiles\TestFiles2" , "NewFile.txt" , FileIO.UICancelOption.DoNothing)
    這個例子的確有錯誤, 但這是文件的錯誤, 因為基本上My.Computer.FileSystem.CopyFile只有四種多載, 只有其中一種會有四個參數
    Sub CopyFile(ByVal sourceFileName As String, ByVal destinationFileName As String, ByVal showUI As UIOption, ByVal onUserCancel As UICancelOption )

    這個多載方法的四個參數在MSDN是這樣解釋
    sourceFileName
        String:要複製的檔案。必要項。
     
    destinationFileName
        String:應複製檔案的目標位置。必要項。

    showUI
        UIOption。是否要視覺化追蹤作業的進度。預設值為 UIOption.OnlyErrorDialogs。必要項。

    onUserCancel
        UICancelOption。指定使用者在作業期間按一下 [取消] 時,所應執行的工作。預設值為 ThrowException。必要項。

    所以那個例子應該改成以下這樣才對
      My.Computer.FileSystem.CopyFile("c:\1\abc.txt", "c:\2\NewFile.TXT", FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing)

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    如果你自私地不肯回饋與分享,那別人為何要花時間回答你的問題?
    2009年11月30日 下午 12:01
    版主