Usuwanie znaków z końca łańcucha

0

Cześć. Mam problem. W zmiennej path mam jakiś adres (lokalizacje pliku lub folderu) np. 'c:/folder'. Jednak gdy mam 'c:/folder/plik.txt' to chciałbym by ta zmienna usunęła '/plik.txt' i została sama ścieżka. Nie mogę tego zrobić ani za pomocą delete ani wyszukiwania łańcucha gdyż ścieżka może być dłuższa lub krótsza i mieć różne pliki np. dat, png, doc itp.

Wymyśliłem sobie że to może działać tak że będzie usuwało ciąg znaków zaczynając od końca aż nie napotka "/" i wtedy jego również usuwa i na tym poprzestaje, reszte zostawia. Szukałem takich funkcji lecz nic nie znalazłem :/

Więc co mam zrobić by została lokalizacja bez pliku, a gdy jednak będzie sama lokalizacja to nic nie będzie robiło?

0

Jeżeli jest to delphi to ja bym zrobił to amatorko:

przykładowa ścieżka
c:/noob/noob1/plik.text
odwracam łańcuch (jest specjalna funkcja do tego)
txet.kilp/1boon/boon/:c
szukam pierwszego znaku '/'
w tym przypadku zwróci 10 bo jest dziesiąty
i zapomocą funkcji delete usuwam pierwsze 10 znaków
potem odwracam łańcuch z powrotem i jest git :D

UPS nie doczytałem, że może być sama lokalizacja sry

Można bybyło zrobić, że odwraca i szuka kropki jak nie ma kropki to teorytycznie nie usuwa nic ale można zdarzyć się, że jakis folder ma w sobie kropke ;//
Więc jak bybyło tak, że folder nie ma kropki to usuwa tak jak wczesniej pisałem od pierwszzego / a jak nie ma kropki to nie robi nic.

0

w jakim języku? generalnie należy szukać od końca stringa pierwszego napotkanego znaku / albo \, i w tym miejscu zakończyć stringa.

0

Szukasz od końca '.' jeżeli jest to szukasz od końca '/' potem tylko wyciągasz string od początku do miejsca wystąpienia '/' - 1
W C++:

string path = "c:/folder/plik.txt";
size_t pos;
if(path.find_last_of('.') != npos)
{
    pos = path.find_last_of("/\\");
    path = path.substr(0, pos - 1);
}
0

Zapomniałem dodać że chodzi o delphi. Posłuchałem pierwszej rady i mam coś takiego:

var
path:string;
znak:integer;

begin
path:=lista.Path;
path:=AnsiReverseString(path);
znak:=pos('\', path);
Delete(path, 1, znak);

path:=AnsiReverseString(path);
result:=Path;

Generalnie działa ze ścieżkami jak jest plik tzn wycina dobrze, ale oczywiste że to mi wytnie również gdy nie ma pliku tylko folder tzn z c:\folder\2folder zrobi mi c:\folder teraz myślę jaki zrobić warunek by wykryło że jest plik z rozszerzeniem, chciałem zrobić aby szukało kropki no ale w folderze też może być kropka.

0

c:/folder/fol.der/folder/plik.text
c:/folder/folder/folder/plik.text
c:/folder/folder/folder
c:/folder/fol.der/folder
c:/folder/folder/fol.der

Są tu wszystkie typy scieżki w naszym przypadku jakie mogą być, trzeba się teraz zastanowić aby twój program obsługiwał wszystkie :P

0

nie jesteś w stanie na podstawie samej ścieżki określić czy na końcu jest plik czy katalog.
BTW nikt nie wpadł na genialny pomysł aby skorzystać z gotowych funkcji - ExtractFilePath

0
Misiekd napisał(a)

nie jesteś w stanie na podstawie samej ścieżki określić czy na końcu jest plik czy katalog.

if FileExists('C:\Katalog\CzyToJestPlik')
then
  // ścieżka wskazuje na plik
  ExtractFilePath('C:\Katalog\CzyToJestPlik')
  // w wyniku otrzymamy 'C:\Katalog\'
else
  // ścieżka określa katalog lub jest błędna

Aby uniknąć nieporozumień ścieżka wskazująca na katalog powinna być zakończona znakiem backslash "****"

0
Misiekd napisał(a)

nie jesteś w stanie na podstawie samej ścieżki określić czy na końcu jest plik czy katalog.
BTW nikt nie wpadł na genialny pomysł aby skorzystać z gotowych funkcji - ExtractFilePath

Jeśli dam ExtractFilePath(path); to to da ten sam efekt co ta nasza długa funkcja, owszem szybsze i łatwiejsze ale nadal to samo :/ Ja nie chcę wyświetlić katalogu mojego programu tylko dokładnie o to chodzi że mam komponent ShellTreeView i chcę zrobić pod tym button "Nowy folder" który utworzy nowy katalog w tym miejscu gdzie mam zaznaczone na shelltreeview, tylko jak zaznaczę plik no to będzie chciało mi utworzyć folder c:\folder\plik.txt\folder2 :/ Chciałbym zrobić taką funkcje, że gdy zamiast folderu wybiorę plik to nowy folder utworzy mi właśnie tam gdzie jest ten plik, dlatego chciałem usunąć nazwę pliku ze ścieżki. Nie wiedziałem że to będzie takie trudne.

Tak na prawdę to wszystko mogłoby się opierać na znalezieniu "txt" w ścieżce bo mój shelltreeview ma wyświetlać tylko katalogi i pliki txt, jednak nie potrafię dodać filtru do tego komponentu. http://delphi.about.com/b/2009/09/24/how-to-filter-the-files-and-folders-displayed-by-the-tshelltreeview.htm to mi nie działa, tzn zrobiłem sobie jedno rozszerzenie .txt w tym combo jednak za każdym razem widzę same foldery, nie chce mi wyświetlić tych .txt :/

Dlatego właśnie okrężną drogą, mimo iż nie wygodną. Bo to co jest w tym poradniku po prostu mi nie działa.

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