如何檢查目錄是否只讀?檢查目錄是否可讀
檢查目錄是否可讀
回答
您可以使用FileGetAttr
函數並檢查faReadOnly
標誌是否已設置。
試試這個代碼
function DirIsReadOnly(Path:string):Boolean;
var
attrs : Integer;
begin
attrs := FileGetAttr(Path);
Result := (attrs and faReadOnly) > 0;
end;
想法:如果Path指向「除目錄之外的其他東西」,或者使用Assert(DirectoryExists(Path)),則代碼可能(作爲「特殊獎勵」)拋出異常? – mjn 2010-10-15 14:36:26
此代碼不適用於Windows上的文件夾,僅適用於文件。 Windows文件和文件夾屬性基於傳統FAT,它不包含文件夾的「只讀」屬性。這些在遷移到NTFS時從未更新過,但是可以使用NTFS的高級'ACL'或'訪問控制列表'功能使文件夾爲只讀。我的回答如下(改編自'HeartWave's)更可靠。有關更多詳細信息,請參閱此文章:https://support.microsoft.com/en-gb/help/326549/you-cannot-view-or-change-the-read-only-or-the-system-attributes-of -fo – AlainD 2017-09-07 09:15:10
在Windows API的方式,它是:
fa := GetFileAttributes(PChar(FileName))
if (fa and FILE_ATTRIBUTE_DIRECTORY <> 0) and (fa and FILE_ATTRIBUTE_READONLY <> 0) then
ShowMessage('Directory is read-only');
此答案對文件正確,但不適用於文件夾。 Windows(所有版本)不爲文件夾設置FILE_ATTRIBUTE_READONLY。看到這個問題給出了更多的細節:https://superuser.com/questions/1247843/why-can-i-write-files-into-a-folder-that-is-read-only/1247851?noredirect=1#評論1831434_1247851 – AlainD 2017-09-06 11:26:58
測試,如果該目錄的屬性是R/O只是答案的一部分。由於訪問權限,您可以輕鬆地擁有一個仍然無法寫入的R/W目錄。
最好的方式來檢查,如果你可以寫一個目錄與否是 - 試試:
FUNCTION WritableDir(CONST Dir : STRING) : BOOLEAN;
VAR
FIL : FILE;
N : STRING;
I : Cardinal;
BEGIN
REPEAT
N:=IncludeTrailingPathDelimiter(Dir);
FOR I:=1 TO 250-LENGTH(N) DO N:=N+CHAR(RANDOM(26)+65)
UNTIL NOT FileExists(N);
Result:=TRUE;
TRY
AssignFile(FIL,N);
REWRITE(FIL,1);
Result:=FileExists(N); // Not sure if this is needed, but AlainD says so :-)
EXCEPT
Result:=FALSE
END;
IF Result THEN BEGIN
CloseFile(FIL);
ERASE(FIL)
END
END;
版本HeartWare
給是好的,但包含了兩個錯誤。這個修改後的版本工作更可靠,並具有註釋來解釋正在發生的事情:
function IsPathWriteable(const cszPath: String) : Boolean;
var
fileTest: file;
szFile: String;
nChar: Cardinal;
begin
// Generate a random filename that does NOT exist in the directory
Result := True;
repeat
szFile := IncludeTrailingPathDelimiter(cszPath);
for nChar:=1 to (250 - Length(szFile)) do
szFile := (szFile + char(Random(26) + 65));
until (not FileExists(szFile));
// Attempt to write the file to the directory. This will fail on something like a CD drive or
// if the user does not have permission, but otherwise should work.
try
AssignFile(fileTest, szFile);
Rewrite(fileTest, 1);
// Note: Actually check for the existence of the file. Windows may appear to have created
// the file, but this fails (without an exception) if advanced security attibutes for the
// folder have denied "Create Files/Write Data" access to the logged in user.
if (not FileExists(szFile)) then
Result := False;
except
Result := False;
end;
// If the file was written to the path, delete it
if (Result) then
begin
CloseFile(fileTest);
Erase(fileTest);
end;
end;
- 1. 檢查文件/目錄條目是否可讀
- 2. 檢查是否每個人都可以讀取/寫入目錄
- 3. Bash文件或目錄是否可讀?
- 4. 檢查文件是否可讀爲BufferedImage
- 5. 如何檢查目錄是否是Python中的臨時目錄
- 6. 如何檢查IIS目錄是否是虛擬目錄?
- 7. 如何檢查目錄是否存在?
- 8. 檢查目錄是否不存在
- 9. 檢查lua中是否存在目錄?
- 10. Laravel s3檢查目錄是否存在。
- 11. 檢查是否NSOpenPanel返回目錄
- 12. 檢查你是否在主目錄(linux)
- 13. SVNKit - 檢查目錄是否存在
- 14. 檢查目錄是否符號鏈接?
- 15. 檢查目錄是否已更改
- 16. Talend - 檢查目錄是否存在
- 17. NSIS檢查是否存在空目錄
- 18. 檢查根目錄是否凍結
- 19. 檢查目錄是否爲空
- 20. 檢查目錄是否受保護
- 21. C#:如何檢查我是否可以讀取和/或刪除目錄
- 22. C++:如何檢查文件/目錄是否可讀? (PHP等效:is_readable)
- 23. qtreeview測試是否可檢查項目
- 24. 如何檢查是否可以將文件寫入目錄?
- 25. 如何檢查目錄是否可以被UID寫入?
- 26. 檢查一個目錄是否存在並且可訪問
- 27. .NET - 檢查目錄是否可以正常訪問
- 28. bash命令檢查目錄是否可執行
- 29. 如何檢查目錄是否可以在PHP中寫入?
- 30. 如何檢查目錄下是否存在特定目錄?
@Oded:雖然問題確實簡潔,確實能包含所有回答這個問題,因爲它的標籤德爾福所需的信息。 .. – 2010-10-15 09:45:06