0

我正在开发一个库存管理应用程序。我可以创建的每一种项目都继承了一个带有一些字段(创建日期、描述等)的通用基类。所有这些项目都可以有文档文件(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. 我应该以其他方式打开文件吗?也许问用户?
4

2 回答 2

1

我过去不得不构建系统。以下是我解决这些问题的方法:

  1. 是的。不要阻塞 UI 线程。
  2. 对文件名使用 GUID/任何 db 键。
  3. 不。在我的应用程序中,每个文件都可能经过多次修订,并且仅仅因为一个文件在 1.0 版本是重复的,并不意味着它们将来不会出现分歧。
  4. 不要将文件名直接存储在数据库中,尤其是绝对路径。使用更高级别的代码从 DB GUID / ID <=> 文件名进行转换。
  5. 是的。切勿直接修改源文件。您甚至可能想要包含一个签入/签出系统,以防止两个人编辑同一个文件。
  6. 如果您不从一开始就限制您的范围(事实上任何软件产品都可以),这些类型的项目可能会很快失控。我建议您在继续之前确保这确实是您所需要的。
  7. 不。在客户端系统上使用默认应用程序比我见过的任何替代方案都容易得多。
于 2013-03-05T20:12:43.560 回答
0

很多问题都不是真正与代码相关的,但我遇到过像你以前遇到的问题,所以我会尝试一下

  1. 我会说,绝对是的。我已经为此目的使用了Task类,但是如果您使用的是 .Net 4.5,则可以使用await
  2. 我在以前的工作中遇到了同样的问题,我使用 GUIDS 作为文件名,因为它们非常(足够)独特
  3. 您必须澄清这一点,如果某些项目使用相同的文档,也许您可​​以存储对 PDF 的引用(在检查它是否存在之后)
  4. 我只会存储你必须的东西。如果文件位置在同一个地方并且永远不会改变(事情总是在改变),那么我认为只存储文件名没有任何害处。事情确实发生了变化,请注意这一点,因此请尝试使文件位置可配置(app.config、web.config 等)
  5. 我正在传输业务关键文件 - 我使用 File.Copy,直接从源到目标。在将任务标记为已完成之前,我进行了一些额外的检查,以确保文件存在于目标上。大多数时候似乎都很好,如果它由于某种原因失败,它会重试直到它可以复制它。所以你可以调整你的应用程序来做同样的事情,即尝试复制文件,检查文件是否存在,返回成功。
  6. 我认为因为它是文件,所以您总是必须处理文件周围的愚蠢问题(锁定、异常等)。管理这个的最好方法是一个好的框架,从小处着手,只有两个文件夹,然后编写一个控制台应用程序,循环遍历每个文件,将其复制到另一个目录,然后逐步向上。我还没有看到用于管理文件的硬性指南或设计模式,但您可以为它制作一个相当健壮且可重用的框架。
  7. 用户不是通过上传文件来问你吗?
于 2013-03-05T20:09:56.043 回答