在下面的示例中,我正在计算.dfm文件中的行数,由于.dfm是以二进制格式保存的,计数出现了错误。
如果我打开.dfm文件并执行右键单击并将文本dfm设置为“已选中”,则计数将正确进行。下面是代码
function TForm1.FindNumberOfLinesInFile(FileName: String): Integer;
var
contents : TStringList;
filestream : TFileStream;
outStream : TMemoryStream;
begin
try
try
Result := 0;
contents := TStringList.Create;
if edtFileToSearch.Text = '.dfm' then
begin
contents.LoadFromFile(FileName);
//i am binary
if pos('OBJECT', Uppercase(contents[0])) = 0 then // Count is coming wrong with this
begin
contents.Clear;
fileStream := TFileStream.Create(FileName, fmShareDenyNone);
outStream := TMemoryStream.Create;
try
ObjectResourceToText(filestream,outStream);
outStream.Position := 0;
Contents.LoadFromStream(outStream);
finally
FreeAndNil(outStream);
end;
end
else
begin
fileStream := TFileStream.Create(FileName, fmShareDenyNone);
Contents.LoadFromStream(fileStream);
end;
end
else
begin
fileStream := TFileStream.Create(FileName, fmShareDenyNone);
Contents.LoadFromStream(filestream);
end;
Result := contents.Count;
finally
FreeAndNil(fileStream);
FreeAndNil(contents);
end;
except
on e: Exception do Result := -1;
end;
end;我有两个问题
1)如何将文本dfm值设置为签入所有dfm文件(我有大约1000个dfm文件)?
2)如何正确加载二进制文件和计数行数?
发布于 2017-03-21 22:52:07
David的回答回答了您的第一个问题:您可以使用Delphi提供的命令行工具将所有现有的二进制DFM转换为文本。
除了解决您当前的问题外,我们还强烈建议这样做,因为它将使您的问题变得更容易(即完全可能!)在版本控制中对DFM文件的更改进行可视化区分。
至于第二部分,如果出于某些原因,您仍然希望或需要处理代码中的二进制DFM文件,则需要使用TestStreamFormat()函数来确定流是有效的资源流,还是二进制或文本格式的流,然后才调用ObjectResourceToText()函数。
此帮助函数将指定的文件名( DFM)的内容返回到所提供的TStrings (例如TStringlist)中,它演示了这一点,并可能简化您的操作:
procedure GetDfmIntoStrings(aFilename: String; aStrings: TStrings);
var
istrm, ostrm: TStream;
begin
ostrm := NIL;
istrm := TFileStream.Create(aFilename, fmOpenRead or fmShareDenyNone);
try
case TestStreamFormat(istrm) of
sofBinary : begin
ostrm := TStringStream.Create('');
ObjectResourceToText(istrm, ostrm)
end;
sofText : ostrm := istrm;
else
raise EFilerError.Create(aFilename + ' is not a valid resource stream (DFM)');
end;
ostrm.Position := 0;
aStrings.LoadFromStream(ostrm);
finally
if ostrm <> istrm then
ostrm.Free;
istrm.Free;
end;
end;https://stackoverflow.com/questions/42925414
复制相似问题