none
檔案copy問題 RRS feed

  • 問題

  • 想請問如果使用「File.Copy」的話,是不是如果其路徑上有與原檔名一樣的檔案,需先使用「File.Delete」把其刪除呢?但我所做出的程式用此方式之後再用Shell把其路徑下有一執行檔叫出來執行,但有時它會出現「xxx.exe檔案來源正在使用中,無法進行複製」,請問這是什麼樣的問題呢?我該做程式的什麼樣的改變呢?

    我的程式目前是寫:從c:\bin\所有資料--------->>copy-------->>D:\MY\---------->>

    假設D:\MY\有c:\bin\的相同檔名的檔案,就先「刪除D:\MY\有c:\bin\」的檔案---->>

    之後再用Shell啟動D:\MY\xxx.exe

    2006年10月12日 上午 12:55

解答

所有回覆

  • 如果目的地的檔案正在被執行中,自然無法被刪除

     

    2006年10月12日 上午 01:11
  • 但並沒有開啟其中的任何程式><"怎麼也會發生這樣的訊息呢?
    2006年10月12日 上午 02:22
  • 是否方便將這部分的程式碼貼出來參考一下?

     

    2006年10月12日 上午 02:37
  • 要確定該程式完全無被其他軟體呼叫,或未被其他軟體開啟或鎖定。

    常常一些不經意的壞習慣,可能會造成檔案未被正確釋放,就會有這類問題,你的問題還多了一種可能被其他軟體執行中。

    2006年10月12日 上午 02:43
    版主
  • 請問璉大,我想做一個如果我有更新資料的話例如更改程式的某部份之後轉成123.exe檔,把它放到一個固定的路徑底下,如果別台電腦原本有123.exe檔的話,當他們開啟它們的123.exe檔就直接抓我放在固定的路徑底下的123.exe檔,就是抓最新的update的檔案,我該怎麼做呢?我現在是用我上述的方式來做,先另製作一個copy的執行檔放到別台電腦,以copy到自己的電腦的方式再用shell叫啟123.exe的方式,但這個方式現在會碰到檔案未釋放因此無法copy的問題,那我該如何以其他更好的方式來做到別人執行一個檔案之後就是抓某路徑底下最新的檔案,我如果做程式上的某部份更新的話,就不用一台一台去做更新的動作呢?
    2006年10月13日 上午 12:47
  • 你若是用 VS2005 ,可以考慮使用 ClickOnce 來部署,裡面有自動更新的設計。

    可參考線上手冊這個位置:ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_fxdeploy/html/d8b6e7bb-4ea0-47f3-91cd-48580bdceccc.htm

    摘列部分內容如下:


    .NET Framework 開發人員手冊
    選擇 ClickOnce 更新策略

    ClickOnce 可以提供應用程式自動更新。ClickOnce 應用程式會定期讀取它的部署資訊清單檔,以查看是否有此應用程式的更新可用,如果有,就會下載及執行應用程式的新版本。為了提高效率,只有已變更的檔案才會下載。

    設計 ClickOnce 應用程式時,您需要決定應用程式要使用哪一種策略來查看可用的更新。您有三種基本的策略可以使用:在應用程式啟動時檢查更新、在應用程式啟動後檢查更新 (在背景執行緒中執行),或提供更新的使用者介面。此外,您可以決定應用程式檢查更新的頻率,而且可以讓更新成為必要。

    [略]

    2006年10月13日 上午 01:02
    版主
  • 璉大~~可是我是用「VB.NET」沒有「ClickOnce」><"vb.net有沒有其他的作法呢?
    2006年10月13日 上午 01:54
  • VS2005 是統稱,所以 VB2005 也有。
    2006年10月13日 上午 01:57
    版主
  • 璉大:可是我的版本是2002版(vb.net),我看您提供給我的網頁訊息裡面有說到在 [方案總管] 中選取專案之後,請在 [專案] 功能表上,按一下 [屬性]。 按一下 [發行] 索引標籤。<<<---------但我依照它的說明,我的方案總管下的屬性並沒有-->發行

    這個索引標籤><"我的標籤只有「通用屬性與組態屬性」且裡面的各項目皆沒有「發行」的設定選項,這是否就代表我的版本並沒有提供「clickone」的功能呢?如果真的沒有此功能,是否有其他的方法可以達到我的想法呢?

     

    2006年10月13日 上午 03:16
  • Hi,您好

    您可以考慮看看用兩支程式,啟動程式一執行去做檢查是否有更新檔,有的話進行更新動作,然後把主程式叫起來;沒有的話直接把主程式叫起來然後自行結束;

    用這樣的方式來做更新的動作

    2006年10月13日 上午 04:22
  • 你可以參考一下這一篇文章..我們公司的系統現在就是這樣做的

    http://www.codeproject.com/dotnet/DotNetBuildSmClnts.asp

    2006年10月13日 上午 05:25
  • ClickOnce 是 VS2005 加入的。所以 VS2002/2003 都沒有,不用找了。

    其它篇已經有說明早先的傳統做法,就不再贅述。

    2006年10月13日 上午 05:30
    版主
  • 我現在就是用類似這樣的方式,但就會發生我原先發表的問題,請問您有類似的程式範例嗎?想參考看看,別人大概是如何做的才不會發生錯誤,謝謝~~
    2006年10月13日 上午 08:31
  • 璉大:

    有早先的傳統做法嗎?我怎麼都找不到><"請問有類似的範似可以參考嗎?

    2006年10月13日 上午 08:37
  • bauann 說的就是傳統做法阿~

    速沛小子 給的網址看起來是以元件為單位~

    你 123.exe 去呼叫 update.exe 時,你 update.exe 要確認 123.exe 被終結,否則就會被鎖定。

    2006年10月13日 上午 08:45
    版主
  • 璉大:不好意思><"問個笨問題,如果確定123.exe被終結了呢?程式該如果寫判斷呢?不好意思><"第一次要寫這種程式,不知該如何下手><"
    2006年10月17日 上午 04:38
  • 你可以考慮使用

    System.Diagnostics.Process.GetProcessesByName

    再用

    Process.Kill

    例如:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=27&Function=206

    若要防止砍到其他同名的,需要用全路徑時,需要針對每個 Process 來列舉 Module 路徑,通常路徑 0 是執行檔的全路徑。

    2006年10月17日 上午 05:46
    版主