2013-01-25 87 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中的任何内容中断,您不希望其余的运行。谢谢。 –

相关问题