以下内容似乎是Visual Studio 2017的错误。我将在这里发布它,看看是否有其他解释。
有时Visual Studio会创建一个文件名以.cache
结尾的文件,有时它会以.Cache
结尾。区别仅在于大写方面。
一个示例是此文件,从Visual Studio项目目录开始。
../ListEditor/obj/Debug/ListEditor.csproj.GenerateResource.cache
如果Visual Studio的操作中有一些东西可以避免这个错误,我想知道。
以下是"背景"信息,说明为什么这对我很重要,对我的询问并不重要。
文件名中的这种不一致对 Visual Studio 和 Windows 的操作没有影响,因为操作系统不区分大小写。但是,它在robocopy
和cygwin
和diff --recursive
的交集上确实产生了微妙的影响。
假设按如下方式进行备份和验证。
robocopy c:usersjoedocuments d:windowsbackupdocuments /XJ /MIR
diff --recursive --brief /cygdrive/c/Users/joe/Documents /cygdrive/d/windowsbackup/Documents
RoboCopy 的节约启发式方法是,如果文件的大小或时间戳发生变化,则需要副本。换句话说,robocopy并不完美,但验证旨在发现robocopy的错误。诚然,当没有人弄乱系统时钟并且程序没有反向约会时,这些错误不太可能发生。但是,当复制大量数据时,为了检测损坏,执行验证可能被认为是谨慎的做法。Visual Studio不必要地在.cache
和.Cache
之间交替会给验证带来问题。由于diff
验证发生在区分大小写的cygwin
中,因此将输出以下内容。
Only in /cygdrive/c/users/joe/Documents/source/repos/Auna4/ListEditor/obj/Debug: ListEditor.csproj.GenerateResource.cache
Only in /cygdrive/d/windowsbackup/Documents/source/repos/Auna4/ListEditor/obj/Debug: ListEditor.csproj.GenerateResource.Cache
所以diff
发现了差异,但这不是我们关心的那种差异,此外它拒绝验证文件内容以检测损坏。一种解决方案是编写一个脚本来收集diff
输出并将其传递给cygwincmp
,以执行cygwindiff
拒绝进行的内容验证。 (使用Diff是因为它支持递归,但cmp不支持。
cmp /cygdrive/c/users/joe/Documents/source/repos/Auna4/ListEditor/obj/Debug/ListEditor.csproj.GenerateResource.cache /cygdrive/d/windowsbackup/Documents/source/repos/Auna4/ListEditor/obj/Debug/ListEditor.csproj.GenerateResource.Cache
底线:当没有人为或编程更改系统时钟时,robocopy 可能是可以的,但对于大量数据检测损坏是很好的,但鉴于 Visual Studio 文件名错误,使用"默认"工具不容易实现。 Cygwin已经扩展了"默认"工具的定义。就我而言,如果我担心错误和支持,最流行的系统通常是默认选择。我认为cygwin在将Linux子系统添加到Windows之前非常受欢迎Microsoft。(目前,我不记得为什么我使用cygwin而不是Windows 10 Linux子系统。
编辑:请注意,"MyProgram.exe.config"文件也发生了这种情况,该文件最近显示为"MyProgram.exe.Config"。
我在这里真的没有看到问题,只是说Visual Studio有时对这些.cache
目录的文件名大小写不一致(确实很烦人!
使用Cygwin可以更好地进行此操作的一种方法是使用posix=0
在Cygwin中"挂载"该目录(这只会使Cygwin将挂载目标下的文件/目录视为不区分大小写:https://cygwin.com/cygwin-ug-net/mount.html(。
换句话说(尽管必须这样做很烦人(,编辑/etc/fstab
以使用posix=0
选项挂载 Visual Studio 项目的父目录,以便它正确地将文件视为不区分大小写。 虽然我没有遇到过这个特定的问题,但我通常发现这是在Cygwin下使用Windows应用程序的最佳选择。