File Delphi-读取不包含头信息的文件

File Delphi-读取不包含头信息的文件,file,delphi,File,Delphi,在我的应用程序中,我读取一个文件,计算其MD5散列,用AES128对其进行加密,并将其写入文件注释中 这是因为我需要确保文件不被操纵 不幸的是,当我在文件的“评论”属性中写东西时,它的MD5会发生变化,我的工作就变得毫无用处了 所以,我想读取我的文件,不包括文件的属性,然后才计算我的散列。 现在我用这个函数读取我的文件: function MD5File(const FileName: string): string; var IdMD5: TIdHashMessageDigest5;

在我的应用程序中,我读取一个文件,计算其MD5散列,用AES128对其进行加密,并将其写入文件注释中

这是因为我需要确保文件不被操纵

不幸的是,当我在文件的“评论”属性中写东西时,它的MD5会发生变化,我的工作就变得毫无用处了

所以,我想读取我的文件,不包括文件的属性,然后才计算我的散列。 现在我用这个函数读取我的文件:

function MD5File(const FileName: string): string;
var
  IdMD5: TIdHashMessageDigest5;
  FS: TFileStream;
begin
  IdMD5 := TIdHashMessageDigest5.Create;
  FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Result := IdMD5.HashStreamAsHex(FS)
  finally
    FS.Free;
    IdMD5.Free;
  end;
end;
如何获得“文件属性”的大小?我想它们在页眉或页脚上,所以如果我知道大小,我可以排除文件的第一部分或最后一部分

编辑: 更多信息:我手动编辑文件属性来存储信息(右键单击->属性) 我也认为编辑这些信息不能改变我的MD5。。但这是有原因的! 我阅读了这个文件,并用我文章中的函数计算了它的MD5。 我的问题是,当我在注释中写入任何值时,文件的散列会发生变化,我正在基于文件散列写入字符串


我想我会在计算散列之前擦除“comment”属性。

你的前提是错误的。您输入的“注释”数据存储在.JPG文件的EXIF部分的文件中。它没有固定的偏移量,所以从散列中排除它并不容易。您需要解析.JPG文件,并手动跳过文件中不希望包含在哈希中的部分。读取.JPG文件和其中存储的EXIF信息

或者重新思考你的前提。如果您只是想对图像部分进行散列,则可以将图像作为TBitMap加载,并迭代图像中的所有像素(这是一个非常缓慢的过程),并在散列中包含它们的颜色代码,从而排除不是图像本身实际部分的任何数据


这两种方法都意味着除了知道文件格式的文件(除非它们都是可以加载到TBitmap中的图像文件,因此只能在散列中包含像素)之外,您无法在任何其他文件上执行所尝试的操作。例如,您不能允许人们在f.ex中更改注释或其他内容。Word文档或PDF文档,除非-再次-您手动读取文件,并且仅对您不想让他人更改的部分计算哈希值。

我们如何知道该文件最初是如何编写的?通常,关于文件的附加元数据不会存储在文件本身中,因此您的前提是错误的。某些特定的文件类型(如MS Word)支持嵌入的文件属性,但对于大多数文件类型,额外的数据存储在NTFS替代数据流中。这些数据不仅仅是从文件的普通打开和读取中包含的,因此如果您获取了这些数据,那么您要么将其存储在错误的位置,要么以不同的方式读取。请描述如何存储属性。要对文件中不是哈希的部分进行哈希。好的去做吧。什么阻止了你?换句话说,你到底在问什么?@DavidHeffernan编辑的问题:我只想要一个在编辑文件属性时不会改变的哈希值(使用windows右键单击->详细信息中的属性选项卡),所以我必须在没有这些属性的情况下读取该文件!那么,这些财产存放在哪里?它们可以存放在任何地方。只有知道文件格式的人才能知道这一点。由于您没有告诉我们有关该文件的任何信息,因此无法期望得到详细的帮助。谢谢,现在一切都有意义了!我已经在使用delphi插件来编写EXIF(CCR-EXIF),但我没有意识到它可以改变我的哈希!顺便说一句,我刚刚发现使用该组件写入空的exif数据会导致使用不同散列的文件!现在我达到了我的目标,再次感谢你:)