【问题标题】:How to project any folder changes to a new folder and leave original untouched?如何将任何文件夹更改投影到新文件夹并保持原始不变?
【发布时间】:2012-07-06 22:12:50
【问题描述】:

在我的程序中,我正在调用对文件夹内容进行大量更改的方法,包括:

deleting files/folders,
changing files/folders,
adding files/folders,
adding/deleting symboliclinks/junctions.

到目前为止,这没有问题。但我想出了一个想法,可以选择将文件夹的最终状态(在所有操作完成后)投影到另一个文件夹,以便原始文件夹保持不变。

仅在应用操作之前复制文件夹是不合适的,因为操作可能会删除大量数据,而这些数据必须事先进行不必要的复制。所以我想到,一个专业的程序员肯定不会这样处理。

理想情况下我会写这样的东西(伪代码):

originalFolder.Delete(很多文件).Add(一些其他的东西,可能会改变一些权限等).ProjectTo(newFolder)

是否有某种设计模式或其他方式可以实现这样的目标?也许一些虚拟文件系统我可以在将其具体化到单独的文件夹之前对其进行处理?

我知道如何编写扩展方法,并且我已经编写了很多琐碎的方法,但我真的需要走上正确的道路才能实现这样的目标。

【问题讨论】:

  • 听起来有点不清楚。您是说您希望能够在一个文件夹中模拟对特定文件的更改,然后在另一个文件夹中实际进行更改。它会选择在另一个文件夹中更改什么文件?
  • 您希望仅投影您的更改还是原始文件夹的最终状态?因为如果您只想要原始文件夹的最终状态,则归结为在所有操作完成后获取原始文件夹的副本...
  • 我想确保原始文件夹永远不会被触及,所以我们假设它是只读的。现在我想定义对该文件夹的各种虚拟更改(添加/删除文件/文件夹/链接)。然后我想在另一个位置创建一个文件夹,该文件夹是该文件夹的精确副本,因为如果它首先被修改。

标签: c# .net filesystems directory


【解决方案1】:

如果添加和删除将通过您的 api 完成,那么您可以修改内存中的文件列表而无需接触物理文件,并且当您设置好后,使用最终文件夹上的副本进行更改。

当然,这假设您在任何情况下都不需要更改文件,因此您无需在提交之前通过文件系统读取新结构,我的意思是它将完全在您的应用程序中。

如果这是在 linux 上,我会建议另一种解决方案,即使用硬链接并将文件硬链接到许多文件夹,因此实际上可以对第一个文件夹执行任何您想要的操作,而无需触及第二个文件夹。我不确定 NTFS 是否支持。

【讨论】:

  • +1 - 是的,我也会这样做。套用 AhHatem,通过递归原始文件结构构建对象树,在内存树上虚拟执行所有操作,然后仅复制任何虚拟删除操作后剩余的文件。
【解决方案2】:

如果您只想延迟对原始文件夹的更改,直到您确定要提交它们,那么工作单元模式可能会解决问题。将要应用于文件夹的所有操作存储在容器中,然后按顺序提交。

这听起来有点危险,因为在更改提交之前对原始文件夹的更改很容易搞砸。在这种情况下,您必须实施某种并发检查以尽可能确定所有操作都会成功。

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多