借助DiscUtils迁移含特殊字符的Linux虚拟机VHDX文件至Windows的问题
解决VHDX镜像中含特殊字符的Linux文件迁移至Windows的问题
问题核心:通过DiscUtils读取Linux系统的VHDX镜像文件时,里面的文件名带Windows不支持的特殊字符,直接用原文件名创建目标文件会失败,原代码因目标文件名非法无法执行。
直接修改代码即可,核心是先过滤文件名里的Windows非法字符,再创建目标文件:
首先写个清理文件名的方法,把Windows不认的字符替换成下划线(或其他合法字符):
private static readonly char[] InvalidWindowsChars = Path.GetInvalidFileNameChars(); private static string CleanFileName(string originalName) { return new string(originalName.Select(c => InvalidWindowsChars.Contains(c) ? '_' : c).ToArray()); }
然后调整复制逻辑,用清理后的文件名创建目标文件:
// 先清理原始文件名 string cleanedFileName = CleanFileName(name); // 用Path.Combine拼接路径更稳妥,避免手动拼接出错 string targetPath = Path.Combine(@"D:\", cleanedFileName); // 读取VHDX镜像里的源文件流 using var sourceStream = fs.OpenFile(name, FileMode.Open, FileAccess.Read); // 用合法文件名创建本地目标文件流 using var targetStream = System.IO.File.OpenWrite(targetPath); sourceStream.CopyTo(targetStream);
几个注意点:
- 用
Path.GetInvalidFileNameChars()直接获取Windows禁止的文件名字符,不用手动枚举 - 用
using包裹流对象,自动释放资源,避免内存泄漏 - 如果担心清理后出现重名文件,可以额外加逻辑处理,比如给重复文件名添加序号后缀(如
test_1.txt、test_2.txt)
内容的提问来源于stack exchange,提问作者waldez george
相关产品推荐
相关产品推荐

