procedure TForm1.Button1Click(Sender: TObject);
begin
if not deletefile('c:\test') then
raiselastoserror
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not deletefile('c:\test') then
raiselastoserror
end;
我得到操作系统错误5:访问被拒绝 当我使用相同的代码删除文件说wwj.txt它工作正常,但不适用于文件夹我做错了什么?
答案 0 :(得分:5)
请改用RemoveDir()程序。确保它不是您的应用程序的当前目录,或任何其他目录,或者它将保留。必须使用SysUtils才能获得该功能。
如果需要,请先删除目录内容(如下)。可以递归删除,并考虑'。'的含义。测试您是否使用带有'。'的目录或文件。
procedure DeleteFiles( szDBDirectory : string );
var
szFile : string;
SearchRec: TSearchRec;
szSearchPath : string;
nResult : integer;
begin
szSearchPath := szDBDirectory;
nResult := FindFirst(szSearchPath + '\*.*', faAnyFile, SearchRec);
try
while 0 = nResult do
begin
if('.' <> SearchRec.Name[1]) then
begin
szFile := szSearchPath + '\' + SearchRec.Name;
{$IFDEF DEBUG_DELETE}
CodeSite.Send('Deleting "' + szFile + '"');
{$ENDIF}
FileSetAttr(szFile, 0);
DeleteFile(szFile);
end;
nResult := FindNext(SearchRec);
end;
finally
FindClose(SearchRec);
end;
end;
答案 1 :(得分:3)
您可以使用shell函数。根据{{3}},这将删除非空文件夹,即使它们包含子文件夹:
uses ShellAPI;
Function DelTree(DirName : string): Boolean;
var
SHFileOpStruct : TSHFileOpStruct;
DirBuf : array [0..255] of char;
begin
try
Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
FillChar(DirBuf, Sizeof(DirBuf), 0 ) ;
StrPCopy(DirBuf, DirName) ;
with SHFileOpStruct do begin
Wnd := 0;
pFrom := @DirBuf;
wFunc := FO_DELETE;
fFlags := FOF_ALLOWUNDO;
fFlags := fFlags or FOF_NOCONFIRMATION;
fFlags := fFlags or FOF_SILENT;
end;
Result := (SHFileOperation(SHFileOpStruct) = 0) ;
except
Result := False;
end;
end;
答案 2 :(得分:3)
您可以使用Windows API中的SHFileOperation函数。 ShellApi中定义了对它的引用。但是,我建议您查看Jedi Code Library。单元JclFileUtils包含一个DeleteDirectory函数,它更容易使用;它甚至可以选择将已删除的目录发送到回收站。
答案 3 :(得分:2)
你做错了是使用DeleteFile
删除不是文件的内容。 The documentation建议你:
- 要递归删除目录中的文件,请使用
SHFileOperation
功能。- 要删除空目录,请使用
RemoveDirectory
功能。
文档没有明确告诉您不要在目录上使用DeleteFile
,但是其他两条指令暗示了它。