Dakuan schrieb:
Aus der Problembeschreibung wurde ich nicht ganz schlau.
Ich befinde mich in einem Verzeichnis und will da eine Liste mit Dateinamen abarbeiten und nach Vorschaubildern suchen oder bei Bedarf neue erstellen. Der Verzeichnispfad ist dabei erstmal konstant.
Hier mal 2 Beispiele:
/home/manfred/Musik/
Leo Kottke - Last Steam Engine Train 2012 in Hamburg, Germany-Zvr8Co3fJqI.mp4
/home/manfred/Musik/Leo Kottke - Last Steam Engine Train 2012 in Hamburg, Germany-Zvr8Co3fJqI.mp4
/home/manfred/Musik/Last Steam Engine Train guitar-YFFGdpj1Lv8.mp4
Furchtbar lange Dateinamen mit Leerzeichen und Pi-pa-po - das sind nicht Beispiele wie sie mir vorschweben.
Du willst ja Hilfe, also solltest Du ein kleines Demoprogramm machen, in dem es nur um die Frage geht, die geklärt werden soll. Nicht das Programm, in dem das Problem aufgetreten ist mit all dem Kontext, der den Blick auf das Wesentliche versperrt.
Das Programm sollte, so wie es ist, an den Compiler verfütterbar sein, kompilieren und das Problem zeigen. Je nach Problemlage kompiliert es natürlich auch nicht. Beim Verfertigen eines solchen Demos und der Eingrenzung des Problems auf das eigentliche findet man ca. 50% der Fehler übrigens selbst. Weil man noch mal gründlicher nachdenkt, oder weil bei der Eingrenzung das Problem unerwarteter Weise verschwunden ist - nicht aufgrund magischer Mächte, sondern weil es an einer anderen Stelle lag, als man dachte.
Testcode müsste ich erst bauen. Aber ich kann die alte Version der Funktion zeigen:
| char *
Thumbutil::make_thumb_name( const char * fname, char ** uri_ptr ) {
GChecksum * checksum;
char * p;
char * uri_path; // gchar * uri_path;
char * filename;
|
Hier muss ich erst mal recherchieren, was GChecksum ist, in welcher Library. Die Includeheader sind offensichtlich versteckt worden, damit man es nicht so leicht hat, Dir zu helfen.
checksum = g_checksum_new( G_CHECKSUM_MD5 );
strcpy( file_path+file_path_len, fname );
uri_path = g_filename_to_uri( file_path, NULL, NULL );
g_checksum_update( checksum, (const guchar*)uri_path, strlen( uri_path ) );
if( uri_ptr )
*uri_ptr = uri_path; // user wants this string
else
free( uri_path );
p = thumbnail_path + thumbnail_path_len;
filename = g_strconcat( g_checksum_get_string( checksum ), ".png", NULL );
strcpy( p, filename );
g_free( filename );
return thumbnail_path;
}
file_path ist dabei der oben erwähnte statische Puffer, der jetzt "dynamisiert" werden soll.
Nein, file_path gibt es gar nicht, das ist nirgends deklariert. Ist das eine globale Variable? Wenn das ein Wettbewerb um 10.000 Euro wäre, dann wäre es eine interessante Herausforderung.
Alle Arbeit, die Du schon erledigt hast, müssen die 10 Leute, die Dir helfen wollen, nicht mehr machen. So müssen 10 Leute arbeiten, um überhaupt heraus zu finden, was das Problem ist. Eine irrsinnige Vergeudung von Ressourcen.
Wenn es nur um das Zusammensetzen eines Namens geht, dann würde ich das so machen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main (void)
{
string fname[] = {"dmesg",
"auth.log",
"fontconfig.log"};
for (int i = 0; i < 3; ++i)
{
stringstream pfad;
pfad << "/var/log/" << fname[i];
cout << pfad.str() << endl;
}
return 0;
}
|
Wie gesagt, ich bin bei C++ nicht up to date, sonst wüsste ich, wie man die Arraygröße ermittelt und hätte nicht "3" benutzt.
Das Demo kann jeder in seinenn Editor kopieren, in einem Schmodderdir speichern, kompilieren, wenn ich noch nachtrage, dass ich es mit
| g++ -std=gnu++17 -Wall -o cppstr cppstr.cc
|
kompiliert habe. Dateien braucht niemand, um Stringfunktionen zu testen, aber falls doch kann man auch mit "./foo" und a, b, c arbeiten, und
| mkdir foo; touch ./foo/{a..c}
|
noch als Kommentar im Quellcode mitgeben, damit der User die notwendigen Daten hat, um das Programm zu testen. Jeder Tastaturanschlag, den der Helfer spart, bringt Dir auf einen Schlag 100 neue Helfer, die plötzlich helfen wollen (auf glatte 100 nach oben gerundet ☺ ).
Und alle Zeit, die die Helfer sparen, wenn sie Dir helfen, können sie in Dein nächstes Problem investieren.
Und oft hilft der Code zu verstehen, was das Problem eigentlich ist.
Ich habe verstanden, dass der Pfad ("./foo/") mit Dateiname (a, b, c) verknüpft, Dir vom Speicherbedarf Sorgen macht, aber gut möglich, dass ich falsch liege.