【问题标题】:LastWriteTime being modified when copying to Dropbox folder复制到 Dropbox 文件夹时修改 LastWriteTime
【发布时间】:2015-02-09 15:41:39
【问题描述】:

我有一个小 C# 脚本,用于将我的开发文件夹备份到我的 Dropbox 文件夹,比较每个文件的源和目标 FileInfo.LastWriteTime,然后在需要时执行 File.Copy

我注意到,新创建的文件不仅按预期在脚本的以下运行中被复制,而且在之后的运行中也被复制,尽管在此期间没有被修改。

第一次复制每个文件时,LastModifiedDate 似乎被四舍五入到最接近的秒数,使其下次看起来比原始文件更旧。在下一次运行时,文件会再次被复制,但现在 LastModifiedDate 不会向下舍入,即使文件实际上已被修改,所以从那时起一切都按预期工作。

谁能解释这里发生了什么?

更新:

似乎只影响某些文件类型,.png 就是其中之一。这个问题可以用下面的代码来演示:

var source = @"c:\temp\test.png";
var target = @"C:\Users\Me\Dropbox\test.png";
Console.WriteLine(File.GetLastWriteTime(source).ToString("HH:mm:ss.fff"));
Console.WriteLine(File.GetLastWriteTime(target).ToString("HH:mm:ss.fff")); 
File.Copy(source, target, true);
Console.WriteLine(File.GetLastWriteTime(source).ToString("HH:mm:ss.fff"));
Console.WriteLine(File.GetLastWriteTime(target).ToString("HH:mm:ss.fff"));

第一次运行我们得到:

17:29:01.618 (source)
00:00:00.000 (target doesn't exist yet)
17:29:01.618 (source unchanged)
17:29:01.618 (target as source)

第二次运行:

17:29:01.618 (source unchanged)
17:29:01.000 (target has been rounded down)
17:29:01.618 (source unchanged)
17:29:01.618 (target as source again)

第三次及以后的运行:

17:29:01.618 (source unchanged)
17:29:01.000 (target still as source - no rounding down)
17:29:01.618 (source unchanged)
17:29:01.618 (target as source)

更新:

Procmon 显示 Dropbox.exe 在初始复制大约三秒后执行 SetBasicInformationFile 操作,这似乎是发生更改的时间,尽管 Procmon 没有将文件时间显示到毫秒。

由于它似乎只影响图形文件,我认为这与 Dropbox 缩略图生成有关,但我真的看不出他们这样做的任何充分理由,尤其是当他们在下次复制时间戳时保持完整.

【问题讨论】:

  • 您在使用 Dropbox API 吗?或者只是在本地文件系统上移动文件?如果是后者,我不确定这里是否真的存在编程问题。
  • 为什么针对文件系统而不是 API 的编程问题更少?无论如何,我都会承认它处于边缘。无论如何,它是文件系统,如问题中所述。
  • 嗨@Plutonix,这很有趣,但如果它应该包含任何有助于解决问题的内容,我就错过了。
  • For example, the resolution of create time on FAT is 10 milliseconds, while write time has a resolution of 2 seconds and access time has a resolution of 1 day, so it is really the access date.

标签: c# windows file backup dropbox


【解决方案1】:

可能是当您将文件复制到 Dropbox 监视文件夹时,Dropbox 后台同步应用随后会将文件上传到 Dropbox。完成此操作后,它会再次进行同步,以使本地文件的时间与上传的时间相同。下次运行一个提琴手会话,看看上传后是否从 Dropbox 下载。

【讨论】:

  • 我在 Fiddler 中没有看到任何内容。是的,我假设它是由 Dropbox 同步引起的,但我看不出它应该以这种方式运行的任何原因。
  • 尝试禁用同步应用并在重新打开时观看新文件。实际上可能是本地应用程序正在触摸文件以更新修改后的时间戳。如果日期相差不到一秒,您可能需要更改脚本以添加文件比较。
  • 如果我暂停同步,日期保持不变。当我恢复同步时,日期会在它达到“最新”状态之前四舍五入。
  • 这听起来像是 Dropbox 团队的计划设计。他们很可能会这样做,因此他们只需要担心每一秒的变化。您将不得不忍受它或添加文件比较。
  • 使用PROCMON查看是否回写
【解决方案2】:

好的,基于此

我有一个小 C# 脚本,用于将我的开发文件夹备份到 我的 Dropbox 文件夹

您是否考虑过使用存档位?当文件更改时,它将获得 SET,而您在复制文件时将其取消设置。 (你是你的代码,一旦你完成了你的备份就取消设置)

http://en.wikipedia.org/wiki/Archive_bit

另外,ROBOCOPY 呢?

http://en.wikipedia.org/wiki/Robocopy

它可能对你有用,不需要代码.. 没有 c# 代码

ROBOCOPY C:\SOURCE C:\DEST /M /S

/M : 类似 /A,但从源文件中删除存档属性。

还有一个 :) 你可以对文件进行 CRC 检查吗?不过那会更费时间。

如果您想找出文件日期时间发生变化的原因,请使用 PROCMON 来查看 DROPBOX 是否正在改变它,可能是时区问题,也可能只是它所做的事情。 https://technet.microsoft.com/en-us/library/bb896645.aspx

【讨论】:

  • 感谢 Procmon 的建议。正如我只能假设的那样,它似乎确实确认了 Dropbox 正在更改此文件。不过,我想知道为什么,因为我确实想在我的情况下使用最后修改日期,而不是存档位或 crc 检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2016-06-07
  • 2017-08-12
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多