2014-11-21 140 views
0

我正在使用第三方库将文档转换为PDF。输出文件名将是任意的 - 由客户端提供。如果具有该名称的文件已经存在,我的代码将以类似于MS Windows的方式修改文件名,例如, “myname.txt”变成“myname(1).txt”。我想以某种方式保留输出文件名,以便我的代码不仅是线程安全的,而且还是“流程安全的”,这意味着在我的代码确定了它想要的唯一文件名后,另一个应用程序的进程将不会创建该文件使用,但在它实际创建文件之前。如何以线程安全且处理安全的方式保留文件名

看起来,通常或简单的方法是在编写文件时使用异常处理和循环结构,以便在上次写入尝试失败时创建唯一文件名,因为具有该名称的文件已存在。但是,由于写入文件的第三方实现无疑具有我不希望在循环中多次产生的副作用,因此我想找到一种方法来保证文件名在第一次可用时调用第三方代码来写入文件。

有没有办法做到这一点?

+0

Dupe? http://stackoverflow.com/questions/581570/how-can-i-create-a-temp-file-with-a-specific-extension-with-net – 2014-11-21 16:08:55

+0

@MarcB - 不,因为文件名可以是任何东西,而不是一个GUID。这由调用我的代码的代码提供。我只想使用提供的文件名进行文件写入(如果可用),并且只调用一次第三方写入。 – 2014-11-21 16:20:36

+0

为什么链接的问题不回答这个问题?它向您展示了如何使写入成功,只需使用一个保证不会被采用的名称。 – usr 2014-11-21 16:31:35

回答

1

将PDF写入临时文件,保证不会被采取(例如使用Guid.NewGuid())。然后,将该文件重命名为所需的文件名。这个重命名是原子的。如果失败,您可以决定要做什么。 PDF组件只需要调用一次。重命名可以执行多次,可能使用不同的目标名称。

+0

根据你和Marc的评论,我开始思考这些问题。 – 2014-11-21 16:47:42