作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于此代码:
FN := 'c:\temp\test_file.log';
AFile := TFile.Open(FN, TFileMode.fmOpenOrCreate, TFileAccess.faReadWrite, TFileShare.fsRead);
try
with TFile.OpenRead(FN) do
try
finally
Free;
end;
finally
AFile.Free;
end;
with TFile.Open('c:\temp\test_file.log', TFileMode.fmOpen, TFileAccess.faRead, TFileShare.fsRead) do
try
finally
Free;
end;
FS := TFileStream.Create('c:\temp\test_file.log', fmOpenRead or fmShareDenyWrite);
try
finally
FS.Free;
end;
FS := TFileStream.Create('c:\temp\test_file.log', fmOpenReadWrite or fmShareDenyWrite);
try
finally
FS.Free;
end;
最佳答案
你打电话时
TFile.OpenRead(Path)
TFileStream.Create(Path, fmOpenRead, 0)
FileOpen(Path, fmOpenRead or 0)
CreateFile
路过
0
如
dwShareMode
.以及
CreateFile
的文档说
dwShareMode
的
0
方法:
Prevents other processes from opening a file or device if they request delete, read, or write access.
TFile.OpenRead(Path)
正在尝试以独占共享模式打开文件。由于文件已经打开,这显然会失败。
TFile.OpenRead(Path)
正在使用错误的共享模式。它应该允许读取访问。但是,即使是这种情况,它也无济于事,因为您的另一个句柄具有写访问权限。
TFile.OpenRead
.而是像这样打开它:
TFileStream.Create(Path, fmOpenRead or fmShareDenyNone)
fmShareDenyNone
.您无权拒绝任何形式的共享,因为您已经打开它进行阅读和写作。
TFile.OpenRead()
总是试图获得独占访问。但是您使用
TFile.Open()
也是事实。 ,您调用的第一个电话也可能导致独占访问。即使您指定了
TFileShare.fsRead
.
TFile.Open()
中的代码创建文件流的内容如下:
if Exists(Path) then
Result := TFileStream.Create(Path, LFileStrmAccess, LFileStrmShare)
else
Result := TFileStream.Create(Path, fmCreate, LFileStrmShare);
Exists
之后创建的怎么办返回,但在调用
CreateFile
之前里面做的
TFileStream.Create
?但是我猜代码写成这样的原因是没有办法使用
TFileStream.Create
并有
OPEN_ALWAYS
传递给
CreateFile
.因此,这个可怕的拙劣。
fmCreate
选项被选中,因为
Exists()
返回
False
,则您的共享选项将被忽略。那是因为它们被传递给
Rights
TFileStream.Create
的参数而不是与
fmCreate
结合使用.如
documentation说,在 Windows 上
Rights
参数被忽略。
Result := TFileStream.Create(Path, fmCreate or LFileStrmShare);
Rights
被忽略,那么肯定是
LFileStrmShare
的值被忽略。好吧,事实证明文档撒了谎。
TFileStream.Create
中的代码读到:
constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
var
LShareMode: Word;
begin
if (Mode and fmCreate = fmCreate) then
begin
LShareMode := Mode and $FF;
if LShareMode = $FF then
LShareMode := fmShareExclusive; // For compat in case $FFFF passed as Mode
inherited Create(FileCreate(AFileName, LShareMode, Rights));
if FHandle = INVALID_HANDLE_VALUE then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
end
else
begin
inherited Create(FileOpen(AFileName, Mode or Rights));
if FHandle = INVALID_HANDLE_VALUE then
raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
end;
FFileName := AFileName;
end;
else
分行所在
Mode or Rights
传递给
FileOpen
.那看起来不太像
Rights
正在被忽视。
TFile.Open
时正确设置了共享模式。当且仅当文件已经存在。
TFile.OpenRead
,但是
TFile.Open
也出来了。当你领先时退出并放弃
TFile
共。我不知道 Embarcadero 的 QA 发生了什么
TFile
被引入,但显然有一个重大的失败。将该失败与
TFileStream.Create
的奇怪设计缺陷结合起来你有一个名副其实的错误工厂。
TFileStream.Create
中的错误行为, 其中
Rights
在不应该使用的时候使用,是 XE3 的新手。我相信这是试图处理
TFile.Open
中的假代码。已被报告为
QC#107005 ,它被错误地标记为固定。可悲的是试图修复
TFile.Open
叶子
TFile.Open
还是坏了,反过来又坏了
TFileStream.Create
这曾经有效!
关于delphi - 即使使用 TFile 标记为共享读取,也无法再次打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027127/
鉴于此代码: FN := 'c:\temp\test_file.log'; AFile := TFile.Open(FN, TFileMode.fmOpenOrCreate, TFileAcc
在我的 ROOT 脚本中,我创建了一个 TTree,但我不想保存它。确保 TTree 永远不会保存到 TFile 的最佳方法是什么? 我曾想过为每棵我创建但不需要保存的树创建一个TFile,但感觉应该
我正在尝试通过 rootpy 将 python 类(或仅成员)存储在 ROOT 文件(CERN、TFile)中。 我可以使用 Tree 和 TreeModel 轻松地做到这一点,但这只适用于基本类型,
我有一个以此行开头的 UTF-8 文本文件: 当我使用 TFile.ReadAllText 和 TEncoding.UTF8 读取此文件时: MyStr := TFile.ReadAllText(T
如何读取 zip 存档内的二进制文件(获取字节数组)?我正在使用TrueZip 。 我的例子: import de.schlichtherle.truezip.file.TFile; import j
我是一名优秀的程序员,十分优秀!