C#测试程序异常:sitemap.json文件内容无法更新
解决C#程序中sitemap.json内容无法更新的问题
可能的原因及解决方案
1. 文件写入未强制刷入磁盘(缓存导致)
Windows默认的文件缓存优化可能导致新写入内容未立即同步到磁盘,看起来像是旧数据残留。可以修改写入逻辑,强制绕过缓存直接写入磁盘:
private void WriteSitemap() { var dirPath = @"d:\sitemap"; Directory.CreateDirectory(dirPath); // 调试时输出序列化后的JSON,确认内容是否为最新 var json = JsonSerializer.Serialize(Sitemap); Debug.WriteLine($"序列化内容:{json}"); var filePath = Path.Combine(dirPath, "sitemap2.json"); // 用FileStream强制写入磁盘,无需提前删除文件(FileMode.Create会直接覆盖) using (var fs = new FileStream( filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough)) using (var sw = new StreamWriter(fs, Encoding.UTF8)) { sw.Write(json); sw.Flush(); fs.Flush(true); // 强制将缓冲区内容刷入磁盘 } var byteArray = GetScreenshotsZip(); if (byteArray == null) return; var zipPath = Path.Combine(dirPath, "sitemap-screenshots.zip"); File.WriteAllBytes(zipPath, byteArray); }
2. 验证序列化逻辑是否正常
虽然你确认Sitemap对象内容正确,但可以额外验证序列化结果:
- 替换序列化库测试,比如用Newtonsoft.Json替代System.Text.Json,排除序列化组件的潜在问题:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(Sitemap); - 将序列化后的json字符串输出到控制台或日志,确认每次运行的内容确实不同。
3. 检查Sitemap对象的生命周期
确认每次测试运行时,Sitemap对象是否被正确重置:
- 如果Sitemap是静态变量,需确保每次测试前清空或重新实例化,避免复用旧数据。
- 排查是否有其他代码在写入文件后,又修改Sitemap并回写旧内容。
4. 排查第三方工具干扰
部分杀毒软件、文件监控或备份工具可能拦截文件写入,甚至恢复旧版本:
- 临时关闭杀毒软件或文件保护工具,重新运行测试。
- 右键文件→属性→位置,确认文件实际存储路径是否和代码中的一致,避免系统重定向到虚拟存储区。
5. 验证文件内容真实性
用哈希工具对比文件内容和序列化字符串的哈希值:
- 用PowerShell命令计算文件哈希:
Get-FileHash "d:\sitemap\sitemap2.json" - 计算序列化后json字符串的哈希,确认两者是否一致:
var jsonHash = System.Security.Cryptography.SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(json)); - 若哈希一致,说明写入的是最新内容,问题出在文件查看工具的缓存;若不一致,说明写入过程被篡改。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

