【问题标题】:How to reserve a file name in a thread-safe and process-safe manner如何以线程安全和进程安全的方式保留文件名
【发布时间】:2014-11-21 16:06:59
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

  • @MarcB -- 不,因为文件名可以是任何名称,而不是 GUID。这是由调用我的代码的代码提供的。我只想使用提供的文件名(如果可用)进行文件写入,并且只调用第三方写入一次。
  • 为什么链接的问题没有回答这个问题?它向您展示了如何使写入成功,只需使用一个保证不会被占用的名称。
  • 所以根据链接的问题创建一个唯一的文件名。然后,您可以使用任何您想要的名称来提供该文件,而不管磁盘上的内容是什么。
  • @MarcB -- 因为代码返回一个System.IO.FileInfo 指向磁盘上的文件。我没有在任何地方提供它,使用我的代码的客户将收到FileInfo 并按照他们的意愿使用它。

标签: .net file file-io thread-safety


【解决方案1】:

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

【讨论】:

  • 根据您和 Marc 的 cmets,我开始按照这些思路进行思考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多