2013-01-25 29 views
1

我們有一個系統可以讓用戶上傳文件,我們循環瀏覽該文件,然後製作另一個文件。上傳文件的用戶是已登錄的用戶。將CFTRY標籤包裝在所有內容中

問題是文件包含敏感數據,所以我們必須刪除它們。正如你可以想象的那樣,有幾個地方向文件寫入更多信息並讀取文件。有時候在這個頁面上發生錯誤(通常與CFFILE有關)。

所以我的問題是,把所有的代碼(無論如何都放在一個巨大的CFTRY中)放在哪裏好嗎?然後捕獲發生的任何異常, 然後在CFCATCH內運行另一個CFTRY以刪除2個文件? (閱讀更新)我並不太擔心表現,因爲這個過程不是每天進行一百萬次,也可能是一個月三次。

這是可接受的做法,確保文件被刪除?

UPDATE我不會刪除CFCATCH中的文件。我會先檢查是否存在。然後刪除它們。

+2

可以嗎?那麼,如果你這樣問:任何事情都可以完成。試圖讓「一個巨人''」暗示你有一大堆意大利麪條代碼,你應該考慮重構你的代碼。 – Tomalak

+0

重構代碼很誘人。但我們不能對現行制度做出重大改變,因爲我們計劃在不遠處重寫整個事情。但是這個變化需要完成,因爲它是敏感的信息。我更多地問,如果這是可以接受的做法,以確保文件被刪除。 –

+1

有''([docs](http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-74dd.html)),您可以使用它刪除該文件。 – Tomalak

回答

0

我不得不寫一個新的代碼段,幾乎與我所問的相同的東西。而不是寫個別行到文件,然後圍繞一個大的CFTRY包裝。我改寫每行到一個變量,並結束每一行新的一行字符,在我的情況(Windows)新行字符Chr(13) & Chr(10)。但是,你應該喜歡使用的代碼

<cfset NL = CreateObject("java", "java.lang.System").getProperty("line.separator")> 

這將使變量NL等於當前系統的新行字符以下行。

然後,您可以有一個小的CFTRY,您可以將整個變量寫入文件。

3

無論什麼時候使用try/catch都可以。如果您將try/catch放在101行代碼中而不是允許的100行代碼中,那麼沒有CFML警察會在半夜將您拖走。

但是 - 正如@Tomalak所說 - 你的措辭有點暗示代碼可以承受一些重構。你說你不能重構代碼,但是增加異常處理已經是重構了,所以你明確可以用來做。所以要正確地做。隔離功能的位,並將它們放到不同的模塊中(我不是指所謂的<cfmodule>,我的意思是一般的術語),無論它們是UDF,在一個或多個CFC中的方法(它們可能是不同的,可能不是適用於單個CFC),甚至只包含文件。稍後他們可以更好地重構。開發是迭代式和週期性的,請記住:每次進行更改時,您都不需要它是完美完美。首先,「完美」的定義隨着需求的變化而變化。但是,當您維護它時,您應該始終致力於改進代碼。而且我不認爲簡單地把一個try/catch放在整個事情上表明有改進,更像「這個代碼失控」。

我可以建議的另一件事是做出改進,也許發佈到https://codereview.stackexchange.com/,並找出別人的想法。我不知道該網站上有多少CFer,因此,如果您在Twitter上標記了#ColdFusion,那麼在Twitter上發佈內容可能會很好。

+0

代碼不可怕,我會改變一兩件事。但只是爲了防止CF不得不追加到一個文件。我不是簡單地在任何事情上打一個CFTRY,我已經改進了代碼。只關心其他人如何確保文件被刪除。謝謝你的提示。 –

+0

我從來沒有聽說過這個代碼評論網站。 –

+0

@DanBracuk - 有一堆StackExchange網站。你可以在這裏看到它們的列表:http://stackexchange.com/sites –

1

我們對文件有類似的情況並採取不同的方法。

第1步是限制對包含文件的目錄的訪問。

第2步是計劃清理。我們有一個每天運行的ColdFusion作業。它檢查各種目錄並刪除超過x天的任何文件。 x的值取決於目錄。

這種方法可能會也可能不適合您的情況。

+0

我們已經有了第1步。但我認爲第二步是進一步的「安全措施」。感謝你的回答。 –

3

關於一個巨大的try/catch塊,我會說的唯一的事情就是它停止try塊中的所有處理,所以如果你有東西仍然可以完成,停止整個列車只是因爲有一個季度軌道可能是矯枉過正。

我有一個類似的進程可以處理一堆文件,我們把每個進程放在一個獨立的try/catch塊中,這樣它們就不會相互干擾。即破碎的第一個文件不會搞砸接下來的3個完美的文件。 catch塊只是將錯誤消息添加到字符串中,然後通知用戶文件中的格式不正確(或其他),但格式不正常,但正常處理的文件是正確的。

<!--- file one ---> 
<cftry> 
    some stuff 
    <cfcatch> 
    <cfset errors = errors & "file one did not work because #cfcatch.message#"> 
    </cfcatch> 
</cftry> 

<!--- file 2 ---> 
<cftry> 
    some stuff 
    <cfcatch> 
    <cfset errors = errors & "file two did not work because #cfcatch.message#"> 
    </cfcatch> 
</cftry> 
<cfetc...> 

如果你遍歷一組動態的,你可以把try/catch塊內循環,這樣的try/catch語句不會停止循環和其他的東西可以處理。當然這不工作,如果文件2取決於文件1 ...

<cfloop index = "i" ...> 
    <cftry> 
    some stuff 
    <cfcatch> 
     <cfset errors = errors & "file #i# did not work because #cfcatch.message#"> 
    </cfcatch> 
    </cftry> 
</cfloop> 
+0

當你說所有的處理停止。你的意思是整個Coldfusion停止處理一切或只是該線程? –

+0

@VincentP整個服務器不會停止,或針對該問題的線程。如果在'cftry'塊中發生錯誤,那麼錯誤發生的行和'cfcatch'標籤之間的任何內容都會被跳過。因此,如果在'cftry'塊中有1000行,並且在500行發生錯誤,則跳過下一個500行並執行'cfcatch'塊。 – Travis

+0

哦,是的,這是我對try catch的理解,如果try catch中的任何內容中斷,您不希望其餘的運行。謝謝。 –

相關問題