Sprawdzanie EXT'ka

0

Jak sprawdzić czy string zawiera po kropce rozszerzenie i jesli tak to je usunąc. Oczywiści może on zawierać kropke po której będzie takst (także 3literowy).

Np:
stringa zawiera 'costam.txt' - czyli jest rozpoznawany jako plik i chcę dciąć od niego rozszerzenie
ale jak zawiera
'costam' - to tylko do niego dokleję rozszerzenie
ale
'costam.qpa' - tez nie jest jako plik.

Co zrobić w takiej sytaucji? Czy jedynym wyjściem jest strworzenie tablicy ze wszystkimi rozszerzeniami i prównywanie? Jeśli tak to jak pobrac wszystkie zarejestrowane rozszerzenia?

0

Rozumiem, że chcesz odciąć rozszerzenie, niezależnie od tego, jakie jest? Jeśli tak, to po prostu robisz Delete(nazwa, pos('.', nazwa), length(nazwa)-pos('.', nazwa)+1); i już. A jeśli inaczej, to niebardzo rozumiem, o co chodzi...

0

no to jeszcze nie do końca to.

Załóżmy, że string zawiera tekst 'plik.txt'. Jak wiadomo txt jest rozszerzeniem, więc chcę je odciąć.

Załóżmy, że string zawiera tekst 'plik'. Jak wiadomo nie ma tu rozszerzenia, więc zostawiam to w takiej postaci.

Załóżmy, że string zawiera tekst 'plik.pvv'. Jak wiadomo (najprawdopodobniej) pvv nie jest rozszerzeniem, więc też chce zostawić w takiej postaci jak jest.

0

Można porównywać.
Metodą ExtractFileExt(nazwapliku) (czy coś takiego) można odciąć to co jest po kropce w stringu. A porównać tak (wsyzstkie rozszerzenia są w HKCR):

procedure TForm1.Button1Click(Sender:TObject);
var rejestr:TRegistry;
 nazwapliku,rozszerzenie:string;
begin
 nazwapliku:=Edit1.Text;
 rozszerzenie:=ExtractFileExt(nazwapliku);
 rejestr:=TRegistry.Create;
 rejestr.RootKey:=HKEY_CLASSES_ROOT;
 if rejestr.KeyExists('.'+rozszerzenie) then ShowMessage('Wpisałeś rozszerzenie') else ShowMessage('Z czym do kogo ? Rozszerzenie zarejestrowane w tym systemie wpisz lepiej :)');
 rejestr.Free;
end;
0

wejdz do HK_Classes_Root i pobierz wszystkie klucze i zobacz czy extractfileext(jakisstring) jest w tstrings z kluczami jesli nie to exit; jesli tak to copy() itd. powinno zadziałać

0

Ale to bez sensu takie kombinacje. Co znaczy, że jesli plik kończy się na .pvv, to prawdopodobnie nie jest ro rozszerzeniem?? Zawsze rozszerzenie to tekst po ostatniej kropce. Czyli ExtractFileExt() wystarczy.

0

No moze nie zawsze, bo jak nazwie Nazwa.Pliku to też bedzie bez.. ale zawsze można zrobić warunek: po ostatniej kropce i max. 3 literowe.. - chyba najlepiej..

0

->a myślałeś o tym ze rozszerzenie moze mieć więcej znaków choćby '.manifest'.
->moze <ort>użytkownik </ort>podać stringa typu 'cośtam.ppp' i ppp to nie rozszerzenie,to co wtedy?

0

Nie to jeszcze nie to!!

Może napisze tak:

Chce pobrać liste wszystkich zarejestrowanych rozszerzeń w systemie. Załóżmy, że do TStrings. Nastepnie sprawdzam, czy po kropce (jęsli ta istnieje) w stringu jest rozszerzenie, które zostało zarejestrowane.

Np.:
'tekst.txt' - TXT jest zarejestrowanym rozszerzeniem, więc chce je odciąć (także z kropką).
'tekst' - nie ma tu krokpi, więc o drazu pozostawaim strinbga w takiej postaci
'tekst.komputer' - jest kropka jednak po niej nie wystepuje rozszerzenie (no chyba że zostało takie zarejestrowane, ale najprawdopodobniej nie), wiec to też zostawiam w takiej postaci
'tekst.prr' - j/w

mam nadzieję że teraz już wiecie o co mi chodzi. po prostu chcę pobrac zarejestrowane rozszerzenia i porównywacv je z częscią po kropce w sytringu, ktora nie konieczniej w nim wystepuje.

0

No to odpowiedź już masz. Przykład z gotowym kodem. Czego jeszcze? Teraz tylko dodaj obcinanie tego rozszerzenia, jesli to jest rozszerzenie i masz...

0
function GetExtensions: TStringList;
var
  I: Integer;
  Reg: TRegistry;
begin
  I := 0;
  Reg := TRegistry.Create;
  with Reg do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKeyReadOnly('');
    Result := TStringList.Create;
    GetKeyNames(Result);
    Free;
  end;
  while I < Result.Count do
  begin
    if Result[I][1] <> '.' then
      Result.Delete(I) else Inc(I);
  end;
end;

procedure PrepareFName(var FName: string; var Exts: TStringList);
begin
  if Exts.IndexOf(ExtractFileExt(FName)) <> -1 then
    Delete(FName, Pos('.', FName), Length(FName));
end;

// przykład

var
  S: string;
  Sl: TStringList;
begin
  S := 'plik.txt';
  Sl := GetExtensions;
  PrepareFName(S, Sl);
  ShowMessage(S);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1