2008-09-26 38 views
12

Có cách nào để kiểm tra xem tệp đã được mở bằng ReWrite trong Delphi không?Kiểm tra tệp được mở ở Delphi

Mã sẽ đi một cái gì đó như thế này:

AssignFile(textfile, 'somefile.txt'); 
if not textFile.IsOpen then 
    Rewrite(textFile); 

Trả lời

15

Bạn có thể nhận được chế độ File. (Một lúc, tôi sẽ tạo một ví dụ).

TTextRec (txt) .Mode cung cấp cho bạn chế độ:

55216 = closed 
55217 = open read 
55218 = open write 

fmClosed = $D7B0; 
fmInput = $D7B1; 
fmOutput = $D7B2; 
fmInOut = $D7B3; 

Tìm kiếm TTextRec trong đơn vị hệ thống để biết thêm thông tin.

+0

gì đã xảy ra với ví dụ? – Toby

12

Hãy thử điều này:

function IsFileInUse(fName: string) : boolean; 
var 
    HFileRes: HFILE; 
begin 
    Result := False; 
    if not FileExists(fName) then begin 
    Exit; 
    end; 

    HFileRes := CreateFile(PChar(fName) 
    ,GENERIC_READ or GENERIC_WRITE 
    ,0 
    ,nil 
    ,OPEN_EXISTING 
    ,FILE_ATTRIBUTE_NORMAL 
    ,0); 

    Result := (HFileRes = INVALID_HANDLE_VALUE); 

    if not(Result) then begin 
    CloseHandle(HFileRes); 
    end; 
end; 
+0

Tuyên bố HFILE nằm ở đâu? Chỉnh sửa: Ok nó trong đơn vị Windows. – grinner

1

tôi tìm thấy nó dễ dàng hơn để giữ một biến boolean như người bạn đồng hành; ví dụ: bFileIsOpen. Bất cứ nơi nào tập tin được mở ra, thiết lập bFileIsOpen := true sau đó, bất cứ khi nào bạn cần phải biết nếu tập tin được mở, chỉ cần kiểm tra biến này; Ví dụ: if (bFileIsOpen) then Close(datafile);

6

này hoạt động tốt:

function IsOpen(const txt:TextFile):Boolean; 
const 
    fmTextOpenRead = 55217; 
    fmTextOpenWrite = 55218; 
begin 
    Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite) 
end; 
+0

Phương pháp này ngay tại đây đã giúp tôi rất nhiều. – ChargerIIC

-1

câu trả lời Joseph hoạt động hoàn hảo - Tôi gọi là chức năng filenotopen và thay đổi dòng nếu

Result := (HFileRes = INVALID_HANDLE_VALUE); 

để

Result := NOT (HFileRes = INVALID_HANDLE_VALUE); 

Tôi cũng loại bỏ dòng 'nếu không (Kết quả), sau đó bắt đầu' (và 'kết thúc') để rằng nó luôn luôn đóng handle hoặc bài tập tiếp theo và đọc cho lỗi

bây giờ tôi gọi nó là như thế này

if filenotopen(filename) then 
    begin 
    assignfile(f,filename); 
    reset(f) 
    etc; 
    end 
else 
    message('file open by a different program') 
+0

Tôi nghi ngờ những gì bạn tham chiếu là 7 là câu trả lời của JosephStyons, cũng xem xét đến kiểu mã bạn đã sử dụng. Con số đó không phải là một tham chiếu đến bài đăng và trên thực tế có thể thay đổi bất kỳ lúc nào. Xem [bỏ phiếu] (http://stackoverflow.com/help/why-vote). Nếu tôi đã trình bày sai ý định của bạn, vui lòng quay lại hoặc từ chối chỉnh sửa của tôi. – Reti43

+0

Khá chính xác - Tôi đã muốn bỏ phiếu cho anh ta nhưng là cổ xưa và một thằng ngốc không thể nhìn thấy làm thế nào để làm điều đó. – Whitehairedgeezer

Các vấn đề liên quan