2008-10-15 35 views
2

您是否知道在打開文件之前檢查文件是否存在嚴重的性能問題並將其發送?上下文是一個通過ASP頁面動態提供文件的Web應用程序。我被告知沒有檢查文件是否存在,因爲數據庫存儲了這些信息,不應該是錯誤的。當然,由於任何原因,有時候都是錯誤的,所以我們最終沒有發回任何讓用戶不快的事情。I/O性能完整性檢查 - 檢查文件是否存在

我的直覺是,檢查一個文件的存在是如此便宜,你不應該擔心它,但我被告知,否則。如果有幫助,我們的存儲解決方案是一個相當強大的存儲解決方案(不只是Web服務器上的IDE驅動器)。我的問題基本上是:我的直覺是否正確?

謝謝!

注意:這些文件永遠不會被刪除。他們錯過了一些東西必須出錯,但這種情況一週發生幾次。另外,我想檢查一個文件是否存在的原因是因爲我可以返回磁盤上的備用資產,所以我希望能夠在一個位置上擁有該邏輯,而不是處理捕獲異常並處理在這方面。

+0

我是唯一一個認爲這篇文章與克蘇魯有關的人嗎? – 2008-10-15 15:19:10

回答

5

即使您在嘗試提供服務之前檢查它是否存在,也可能在檢查和服務之間將其刪除。

這裏的問題是,如果您無法提供文件,則不發回任何內容。嘗試提供一個不存在的文件應該拋出一個異常(或者你的平臺上的任何等價物) - 你應該通過返回一個合適的「對不起,我們找不到你的文件」錯誤頁面來處理這個異常。

+0

如果他打開文件而不是檢查其存在,然後如果沒有異常流打開文件?你認爲這會解決你剛剛描述的潛在問題嗎? – Guy 2008-10-15 15:19:16

+0

@Guy:這聽起來像一個體面的想法。 – 2008-10-15 15:20:20

1

只要你沒有使用某種真正奇怪的存儲方案,你就不應該遇到任何嚴重的性能問題。

1

我不知道這種方法有任何主要的性能問題,但在打開它之前檢查文件的存在可能會產生意外的結果(另一個進程可能會在檢查和打開它之間刪除文件)。

3

如果文件沒有出現異常情況(如您所說的db始終是正確的),您不應該檢查它。

如果它不在那裏,你會得到一個異常並相應地處理它。這似乎是你說系統工作的方式,我會這樣處理。

還有一點需要注意的是,如果你說打開的文件不在那裏時什麼都沒有返回,那告訴我你的異常處理有一個設計缺陷,而你的低層沒有冒出足夠的異常要妥善處理,以便您可以將錯誤消息傳回客戶端。

通過適當的異常處理/冒泡,您不應該返回alernate資產。重新思考你的異常處理,而不是重新設計系統應該工作的方式。

0

我真的不知道這是一項便宜還是昂貴的任務,但考慮到如果不檢查文件的存在是否會導致對客戶端的不愉快響應,我會說它並不昂貴。

我確實有一些網絡應用程序,我檢查文件存在和工作得很好。

0

您是重定向到文件,還是通過代碼讀取和提供文件內容?

如果第一個,如果由於某種原因該文件不存在會發生什麼?標準404錯誤,還是你有一個專門的錯誤頁面?這種情況可以接受嗎?

如果是後者,只需打開文件並適當地處理異常。

0

與數據庫或內存讀取相比,文件IO通常成本較高,但是在搜索系統崩潰或未處理時,我已經聽到舊的「數據庫存儲信息,因此它應該沒有錯」例外。所以我會檢查存在和恢復優雅,除非你的性能要求非常高。

0

如果不是文件檢查產生混淆,爲用戶和/或不給他們所需要的東西,或者至少顯示指示問題的錯誤消息 - 那麼沒關係的費用是多少。

應用程序需要該檢查。

0

表現明智應該基本上沒有影響。這裏的緩慢部分是用磁盤讀取文件頭,但如果你要加載文件,你必須這樣做,任何體面的存儲系統(幾乎任何一個過去幾十年)都會從檢查中緩存讀取,以便在您實際打開文件時讀取的一部分快得多。話雖如此,我同意mattlant認爲,如果文件通常應該在那裏,通常會更好地捕獲文件,並且不會出現異常並妥善處理。

0

如果你打算立即打開它,然後檢查它的存在本質上是免費

0

嘗試打開文件,然後流式傳輸。這有可能嗎?這樣,如果你無法打開和流式傳輸,那麼你將無法發送它,並可以採取相應的錯誤處理措施。