我在 MacBook Pro 上的 Virtual Box 中安装了相当新的 Window-7 64 位系统。我在该环境中使用 TextPad 5 编辑 Mac Host 上共享文件夹中的源文件。当我保存一些在这些源文件中,保存的文件结尾部分会重复一次或多次。例如,文件结尾部分有以下内容:
...
return ttp;
};
保存后,打开内容为:
...
return ttp;
};
};
这肯定是文件获取方式的问题书面而不是如何读取它,因为我现在可以看到这一点,无论我使用什么应用程序打开文件(Windows 7 中的 NotePad 和 Word,Mac 中的 TextWrangler)。
我尝试过以 ANSI 和 UTF-8 格式保存,也尝试过在 TextPad 偏好设置中勾选或不勾选“写入 Unicode 和 UTF-8 BOM”。并非所有文件都会发生这种情况,但我看不出哪些文件存在或不存在此问题。写入 Windows 7 c:\ 驱动器的文件不会发生这种情况。到目前为止,其他应用程序保存文件时不会发生这种情况,只有 TextPad 才会发生这种情况。
有任何想法吗?
我的版本:
- 文本板 5.4.2
- Windows 7 Professional 64 位,完全更新
- VirtualBox 4.0.8 r71778
- OSX 10.6.7
答案1
这听起来确实像是 TextPad 中的一个错误 - 我想不出 VirtualBox 会做什么来导致它出现这种情况。共享文件夹的工作方式基本上是将一个虚假的网络驱动器映射到您的 Windows 7 客户机。如果是 VirtualBox 引入了这种奇怪的行为,您应该会在所有其他应用程序中看到它的表现。
我以前见过许多程序在保存文件时出现错误,主要是它们基本上只是覆盖现有文件的内容,而没有真正重置文件长度,也没有将末尾的字节清零。这意味着,如果您通过删除几个字符或行来“缩短”文件,您将得到上面描述的确切行为。您当然可以执行一些测试来真正确定问题的根源,并利用这些测试让作者修复错误:
- 您可以使用“另存为”而不是“仅保存”来复制该行为吗?
- 你能通过缩短文件长度来复制该行为吗?
- 您可以在其他网络驱动器上复制该行为吗?或者仅仅是共享文件夹功能?
- 任何其他“过滤器”是否会影响保存操作,例如防病毒、构建后步骤、源代码控制等。
作为演示,使用 PowerShell - 以下是如何复制您所看到的相同行为的方法。我首先引用了双城记并将其保存为 tale.txt
$text = gc tale.txt
$fs = [System.IO.File]::OpenWrite("tale.txt")
$sw = New-Object System.IO.StreamWriter($fs)
$sw.Write($text.Replace("the",""))
$sw.Dispose()
您可以看到,所有 15 个“the”字都已按预期被空字符串替换,但意外的是,原始文件的最后 45 个字节仍然保留,从而重复了短语“仅限于最高级比较级。“在文件末尾出现两次 - 类似于您上面描述的情况。
为了完整性,上述错误代码示例的简单解决方案是不使用 OpenWrite 方法,而是调用 File 类上的静态 WriteAllText 方法。