【问题标题】:Read a zip file using FileStream then use CopyTo corrupts the file使用 FileStream 读取 zip 文件,然后使用 CopyTo 损坏文件
【发布时间】:2012-10-07 23:04:09
【问题描述】:

您好,我正在从用户的计算机读取文件,然后使用特定的网络凭据将其写入网络共享,这会损坏一小部分文件。 当我在十六进制编辑器中打开文件时,第一行的十六进制是不同的

Header:    00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
Good File: 50 4b 03 04 14 00 08 00 00 00 37 57 51 41 6f 61
Bad File:  50 4b 03 04 14 00 08 00 00 00 b7 56 51 41 6f 61

0a 和 0b 列的差异存在于整个文件中,

如果我以错误的方式解决这个问题,请务必纠正我,或者如果只是一些小事情会更好。任何帮助深表感谢。我正在使用的代码如下

var fileStream = 
    new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.None);

var impersonationContext =
    new WrapperImpersonationContext("myDomain", "myname", "myPass");

        impersonationContext.Enter();

        try
        {
            using (Stream file = File.OpenWrite(destination))
            {
                fileStream.CopyTo(file);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        finally
        {
            impersonationContext.Leave();

            if(fileStream != null)
            {
                fileStream.Close();
            }
        }

【问题讨论】:

  • “非常小的百分比”有多小?您是否尝试过不同的网络和/或硬件?这可能是硬件级别的简单写入错误。
  • 这发生在大约 725 个文件中的 5 个上,但在多台计算机上重复发生在这 5 个文件上。我会尝试写到不同的网络
  • 我同意@driis。对此的一个很好的测试是尝试File.Copy 以查看文件是否损坏。
  • 源是字符串吗?源和目的地是什么形式? (我假设源是网络共享,目标是本地驱动器号卷?)
  • source是一个字符串unc路径到文件的本地副本destination是要写入的文件的字符串unc路径

标签: c# hex filestream


【解决方案1】:

FileStream.CopyTo() 会将 n 个字节写入目标文件,但不会擦除先前存在的目标文件的末尾。用FileMode.Create 打开输出流应该保证一个精确的副本。

最后调用file.SetLength(file.Position); 也可能有效,但我不确定可靠程度...

【讨论】:

  • 这似乎已经解决了问题。非常感谢!尽管根据您的解释,我预计文件在第一次被覆盖时会增加一倍,但事实并非如此。源文件大小为 29,902,损坏的文件大小为 29,967。你也不会认为这只会发生在几个文件上。感谢您的回答,如果我发现它不起作用的情况,我会通知您
  • @claybo.the.invincible 它不是推送字节,而是覆盖它们。
【解决方案2】:

您正在查看 .zip 文件头。可识别的是“PK”,这是发明该格式的人 Phil Katz 的首字母。标头格式为documented here。差异发生在偏移量 10。这是“文件最后修改日期”。修改日期不同的文件并不神秘,也不能轻易解释问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多