是否有设计模式/知道管理文件的好方法?

时间:2013-03-05 19:53:19

标签: c# sql-server file-io

我正在开发库存管理应用程序。我可以创建的每种项都继承了一些带有一些字段的通用基类(创建日期,描述等)。所有这些项目都可以有文档文件(pdf,文本文件,图片,没关系)。这些文件存储在公开可用的网络共享中。我已经有了一个基本的功能原型,可以:要求用户选择一个文件,上传,打开它并将相关信息保存在数据库中。这是一个基本的例子:

//choosing and copying the file
string filename;
string destination;
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();                       
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
  filename = dlg.FileName;
  destination = @"\\theshare\Data\Doc\";
  textBox1.Text = filename;//just for test/display purpose
  File.Copy(filename, destination + dlg.SafeFileName);
  SaveInfoInDatabase(dlg);//description, path
}

//open the file with default application, called by a button press
System.Diagnostics.Process.Start(destination + dlg.SafeFileName);

在进一步讨论之前,我已经问过以下问题:

  1. 我应该异步运行此代码吗?最大的文件是~50 MB
  2. 我是否应该使用GUID作为文件名而不是原始名称,或者只是在相同文件名的情况下在末尾添加数字?
  3. 我该如何处理重复? (假设有20个不同的项目共享相同的内容 pdf文件)
  4. 我应该保存绝对路径还是只保存文件名并使用const字符串作为目录?
  5. 如果可以修改文件,我应该制作本地副本,打开它然后将其复制回来,或者 打开原来的?并发不是一个大问题,它主要是参考资料。
  6. 我走错了路吗?这种任务可能有设计模式/指导方针,但我没有发现任何重要的内容。
  7. 我应该以不同的方式打开文件吗?也许问问用户?

2 个答案:

答案 0 :(得分:1)

过去我必须建立系统。以下是我解决这些问题的方法:

  1. 是。不要阻止UI线程。
  2. 使用GUID /您拥有的任何数据库密钥。
  3. 别。在我的应用程序中,每个文件都可以进行多次修订,只是因为一个文件在版本1.0中是重复的并不意味着它们将来不会分歧。
  4. 不要将文件名直接存储在数据库中,尤其不是绝对路径。使用更高级别的代码从DB GUID / ID&lt; =&gt;转换文件名。
  5. 是。永远不要直接修改源文件。您甚至可能希望包含一个签入/签出系统,以防止两个人编辑同一个文件。
  6. 如果您不从一开始就限制范围,那么这些类型的项目可能会非常快失控(事实上任何软件产品都可以)。我建议你在继续之前确保这是你真正需要的。
  7. 否。使用客户端系统上的默认应用程序比我见过的任何替代方案都容易得多。

答案 1 :(得分:0)

很多问题并不是真正的代码相关,但我遇到过像你以前遇到的问题所以我会采取刺戳

  1. 我会说,绝对肯定是的。我为此目的使用了Task类,但是如果你使用.Net 4.5,你可以使用await
  2. 我在之前的工作中遇到了同样的问题,我使用GUIDS作为文件名,因为它们非常(足够)唯一
  3. 你必须澄清一下,如果某些项目使用相同的文档,也许你可以存储对PDF的引用(在检查它是否存在之后)
  4. 我只存储你所拥有的东西。如果文件位置在同一个地方并且它永远不会改变 (总是会改变) 那么我认为只存储文件名没有任何损害。事情确实发生了变化,请注意这一点,所以尽量使文件位置可配置(app.config,web.config等)
  5. 我正在传输关键业务文件 - 我使用File.Copy,直接从源到目的地。在我将任务标记为已完成之前,我对目标上存在文件进行了一些额外的检查。在大多数情况下似乎很好,如果因任何原因失败,它只会重试,直到它可以复制它。因此,您可以调整您的应用程序以执行相同操作,即尝试并复制文件,检查文件是否存在,返回成功。
  6. 我认为因为它是文件,你总是要处理文件的愚蠢(锁定,异常等)。管理这个的最好方法是一个好的框架,从小开始,只需要两个文件夹并编写一个控制台应用程序,循环遍历每个文件,将其复制到另一个目录,然后继续工作。我没有看到用于管理文件的快速指南或设计模式,但您可以为它制作一个相当强大且可重用的框架。
  7. 用户是否通过上传文件询问您?