【发布时间】:2017-03-07 19:53:48
【问题描述】:
如何在 Delphi 2009 中获取文件的所有者?
我有一个函数可以像这样获取文件属性:
type
TCustomFileInfo= record
CompanyName,
Owner,
SpecialBuild: string;
procedure Clear;
end;
function GetFileInfo(const FileName: string): TCustomFileInfo;
type
PLandCodepage = ^TLandCodepage;
TLandCodepage = record
wLanguage,
wCodePage: word;
end;
var
dummy,
len: cardinal;
buf, pntr: pointer;
lang: string;
begin
len := GetFileVersionInfoSize(PChar(FileName), dummy);
if len = 0 then
RaiseLastOSError;
GetMem(buf, len);
try
if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then
RaiseLastOSError;
if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then
RaiseLastOSError;
lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]);
// Get Company's name, if available...
if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\CompanyName'), pntr, len){ and (@len <> nil)} then
result.CompanyName := PChar(pntr);
finally
FreeMem(buf);
end;
end;
...对于这个 CompanyName 属性来说效果很好,但我不知道如何获取所有者。
此外,当我尝试对没有文件版本号的文件使用相同的方法时,GetFileVersionInfoSize 不起作用,这是有道理的,因为文件没有'根本没有版本号。
GetFileVersionInfoSize 是否有替代方法,或获取文件所有者的其他方法?我不太习惯 windows api,所以我真的不知道这是否是实现我想要的正确方法(获取所有者的名字)。
【问题讨论】:
-
这是你想要的文件系统属性?
-
GetFileVersionInfoSize()返回 0 不是错误,除非GetLastError()表示实际发生了错误。RaiseLastOSError()将始终引发EOSError异常,即使GetLastError()返回 0。 -
@DavidHeffernan 我拍了张照片,可惜是葡萄牙语,不过我想你能看懂:picture
-
@RemyLebeau 说得好。我对 doesn't work 的意思是它像你说的那样返回零,我认为这是没有版本号的文件的预期行为。我想获得一些 XML 文件的所有者...
标签: delphi winapi delphi-2009