IsIniFile 2
user_6919294
pascal
8 months ago
2.7 kB
8
Indexable
{*
#CODE BY IRENEUSZ A.
* Weryfikuje czy plik ma format INI poprzez analizę jego struktury.
* @since 2025-03-20
* @param FileName Ścieżka do weryfikowanego pliku
* @return True gdy plik zawiera poprawny nagłówek sekcji INI
*}
function IsIniFile(const FileName: string): Boolean;
var
FileStream: TFileStream;
Buffer: array[0..1023] of Byte;
BytesRead: Integer;
I, BufferLen: Integer;
InComment: Boolean;
Line: string;
begin
Result := False;
// Walidacja istnienia pliku
if not FileExists(FileName) then
Exit;
try
// Otwarcie pliku w trybie tylko do odczytu z najmniejszymi ograniczeniami dostępu
FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
// Odczyt pierwszego fragmentu wystarczającego do identyfikacji formatu
BytesRead := FileStream.Read(Buffer, SizeOf(Buffer));
if BytesRead <= 0 then Exit;
BufferLen := BytesRead;
SetLength(Line, 0);
InComment := False;
// Skanowanie zawartości bajt po bajcie
for I := 0 to BufferLen - 1 do
begin
case Chr(Buffer[I]) of
#13, #10: // CR, LF - koniec linii
begin
if Length(Line) > 0 then
begin
Line := Trim(Line);
// Sprawdzenie znaczników sekcji INI: [sekcja]
if (Line <> '') and (not InComment) and
(Line[1] = '[') and (Line[Length(Line)] = ']') then
begin
Result := True;
Exit;
end;
// Wykrycie początku komentarza
if Line.StartsWith(';') or Line.StartsWith('#') then
InComment := True;
// Reset przy znaku LF (0x0A)
if Chr(Buffer[I]) = #10 then
begin
SetLength(Line, 0);
InComment := False;
end;
end;
end;
else
// Akumulacja znaków bieżącej linii
Line := Line + Chr(Buffer[I]);
end;
end;
// Obsługa ostatniej linii bez terminatora
if Length(Line) > 0 then
begin
Line := Trim(Line);
if (Line <> '') and (not InComment) and
(Line[1] = '[') and (Line[Length(Line)] = ']') then
begin
Result := True;
end;
end;
finally
FileStream.Free;
end;
except
// Cicha obsługa błędów I/O
Result := False;
end;
end;Editor is loading...
Leave a Comment