2013-10-13 89 views
0

我使用文件名,文本框,「瀏覽」按鈕以及其他一些特定於我的應用程序的功能來編寫輸出文件名選擇的自定義控件。是否可以確定某個文件可以在不打開的情況下寫入?

文本框根據文件名改變顏色。如果文件位置無法寫入,則會變成紅色。如果該文件已經存在,則會變爲黃色。否則,它仍然是系統分配的顏色。

要查看文件是否存在,我使用IO.File.Exists;夠簡單。

我實現了「如果可以寫入文件」作爲一個簡單的try-catch塊,其中實際打開一個文件,寫入文件,關閉然後刪除。如果在任何時候拋出異常,我知道用戶不能使用該文件名,並將文本框變爲紅色。

這是一個全面的;因爲我正在做實際的操作,我打算這麼做,這是很簡單的。然而,讓軟件創建和刪除像瘋了似的文件似乎是不負責任的,只是爲了看看它是否可以。

所以我的問題是,如何在不創建文件的情況下複製此功能?我可以看到我必須:

  1. 檢查路徑是否合法(例如,'z:'不是有效的文件名)。這需要解析路徑並確保所有目錄都存在。
  2. 如果該位置存在,我必須檢查寫入權限。 (爲此已存在幾個回答問題。)

還有其他什麼嗎?

編輯

幾分鐘內,我看到人們已經開始投票了該批評的是我在所有該文件是它發生的實際寫入之前訪問檢查答案。雖然我很欣賞專家們從我的問題中「退後一步」,看看是否有完全不同的方式來實現它,但告訴我,我不應該這樣做,這不是我的問題的答案。

因此,讓我詳細說明我的應用程序(我不希望同時有數百個用戶)。

我在數據採集應用中使用這個文件選擇器控制。在許多情況下,您即將進行的測試在某種程度上是「昂貴的」。因此,非常仔細地設置它是非常重要的。覆蓋數據可能非常昂貴(並且對於可怕的用戶,我有一個複選框會將日期和時間附加到文件名的毫秒)。

因此,我的指示顏色的目的不是爲了讓軟件知道文件可以寫入(該檢查仍然在實際需要的時刻完成)而提供一個絕對的方式,它是用作指示器對於用戶來說,至少他已經正確設置了文件名,所以如果他繼續前進,他肯定不會覆蓋舊數據,並且他的差不多確定最後一刻的IO錯誤(文件名類型錯誤)不會讓實驗運行未記錄。

回答

5

我建議這 - 在用戶提交動作之前不要檢查任何內容。使用目前的方法,即使您驗證文件沒有問題,但當用戶實際承諾寫入文件時,可能會在5秒鐘後鎖定該文件。進行初步檢查可能只會給用戶一個估計成功的錯誤印象。特別是在具有100多個併發用戶的終端服務器上考慮這一點。

顯示重試/取消/等提示沒有任何錯誤。如果沒有訪問權限,並讓用戶決定。

編輯:

沒有違法,但也有這樣的碰撞是如何處理的標準。 Windows標準是向用戶顯示提示。另外考慮這一點 - 如果您突然拒絕寫入該文件夾(您不希望擁有該文件夾),則可能需要聘請另一個系統/網絡管理員。

如果操作成本高昂,確保這個傢伙得到很好的支付。來吧,如果您的網絡在寫作過程中出現故障,該怎麼辦?硬盤?路由器?寫入文件的原因有很多,可能會中斷,您應該爲此做好準備。如果你負擔不起,確保你已經投資了良好的基礎設施和優秀的人才來支持它。

下在地球上,你可以增加文件取得成功鎖定的機會:

  • 選擇一個唯一的文件名,使用基於日期時間哈希作爲後綴/前綴。
  • 寫入用戶的主目錄,也被稱爲%UserProfile%,很可能您會成功。
+2

也有可能使用線程方法進行此操作,並在文件解鎖後提交數據。當然,唯一的問題是鎖定文件中的任何更改是否會影響要寫入的數據。 – Paul

+0

看到我的編輯並相應地更改您的答案。 – pelesl

+0

@Westie:在文件IO麻煩的情況下將數據保存在RAM中是一個好主意。 – pelesl

1

我能理解與不想要,因爲該文件無法寫入,並負責節目會做最好避免局勢可能失去「昂貴」數據的問題。

我會通過cacheing結果做到這一點。在測試運行之前,將模擬結果寫入用戶數據空間中的某個文件,然後將文件保持打開狀態並將真實結果寫入文件。完成後,將其寫入用戶指定的文件。提供一個恢復選項,它將讀取緩存文件並將其寫出到用戶的文件中。

您的方法可能會失敗,因爲文件在開始時是可寫的並不意味着它仍然可寫。網絡可能已經倒閉。有人可能已經刪除了閃存驅動器。其他人可能會通過一個錯誤的路由器進行大量數據傳輸。 (現實世界的情況下 - 我花了很長時間時間來證明它是一個網絡問題,而不是我的程序終於接受是他們的錯,當我發現導演:* *在多臺機器/ s的一次差點就要。肯定會導致一個或多個失敗。)

+0

好主意。寫一個我知道工作的位置,然後將其複製到用戶想要的位置。就崩潰而言,比在RAM中存儲更安全一些。 – pelesl

相關問題