2013-03-06 12 views
11

używam Qt, aby uzyskać nazwę pliku z użytkownikiem:Usuwanie rozszerzenie nazwy pliku w Qt

QString fileName = QFileDialog::getOpenFileName(this,tr("Select an image file"),"d:\\",tr("Image files(*.tiff *.tif)")); 

To działa, ale muszę nazwę pliku bez jego rozszerzenia , jest to możliwe w Qt? whenn Staram:

QString f = QFileInfo(fileName).fileName(); 

f jest jak "filename.tif", ale chcę go mieć "filename".

+0

QFileInfo :: basename() – armanali

Odpowiedz

3

Możesz splitfileName z "." jako separatora tak: „”.

QString croped_fileName=fileName.split(".",QString::SkipEmptyParts).at(0); 

lub użyj section funkcji QString wziąć pierwszą część przed tak:

QString croped_fileName=fileName.section(".",0,0); 
+2

To nie zadziała, jeśli nazwa pliku (bez rozszerzenia) zawiera również ".". – leemes

+7

Po co przerabiać to, co już oferuje 'QFileInfo'? – Angew

+3

Przypuszczam, że Shf także nie wiedział, że 'QFileInfo' już to zapewnia. Głosuję za ponownym przyjęciem. – leemes

1

Można użyć QString::split i użyć . jako miejsca, w którym można je podzielić.

QStringList list1 = str.split(".");

To zwróci QStringList z {"filename", "extenstion"}. Teraz możesz uzyskać nazwę pliku bez rozszerzenia.

+0

To nie będzie działać, jeśli nazwa pliku (bez rozszerzenia) zawiera także '.'. – leemes

+1

@ Pewnie, ale OP tego nie określił, prawda? –

+2

Cóż, "bez rozszerzenia" jest nieco niejednoznaczne, szczególnie w przypadku połączonych rozszerzeń, takich jak ".tar.gz", ale w jego przykładzie tylko usunięcie ostatniej części ma więcej sensu. – leemes

6

Aby poradzić sobie z nazwami plików zawierających wiele punktów, poszukaj ostatniego i podjąć podciąg do tego jednego.

int lastPoint = fileName.lastIndexOf("."); 
QString fileNameNoExt = fileName.left(lastPoint); 

to oczywiście mogą (i powinny) być napisane w funkcji pomocnika do ponownego użycia:

inline QString withoutExtension(const QString & fileName) { 
    return fileName.left(fileName.lastIndexOf(".")); 
} 
+0

Należy zauważyć, że 'QFileInfo' ma już tę funkcję pomocniczą. – Angew

+0

Tak, nie wiedziałem. Moja sugestia była bardziej ogólna: Jeśli napiszesz kod, który najprawdopodobniej będzie ponownie użyty, przenieś go do funkcji. – leemes

68

QFileInfo ma dwie funkcje to: Plik

QString QFileInfo::completeBaseName() const 

Zwraca nazwę z najkrótszych rozszerzenie usunięte (file.tar.gz ->file.tar)

nazwa pliku z rozszerzeniem (najdłuższy usunięte file.tar.gz -> file)

Zwraca

+8

To najbardziej eleganckie rozwiązanie z ręki. Należy jednak zachować ostrożność w klasie 'QFileInfo'. Zawija się wokół pliku i okresowo sprawdza jego właściwości. Może to być problem z wydajnością. Powinieneś więc jak najszybciej zniszczyć obiekt 'QFileInfo' lub wywołać' setCaching (false) '. –