Prblem mit Ordnererstellung
-
Hallo zusammen,
ich habe folgendes Problem:
Ich habe eine Datumsangabe mit Datetime realisiert. Nun möchte ich diese Datum als Ordnername verwenden. Weil die Uhrzeit mit : dargestellt ist, habe ich mit replace die : in . getauscht.
Wenn ich nun das veraenderte DateTime (als Ornername) mit _mkdir einen Ordner erstellen möchte wird kein Ordner erstellt.
Schreibe ich nun diese komplette Datumsangabe mit "" in eine Variablen rein, wird der Ordner erstellt.
Um sich besser ein Bild machen zu können der C++ Code:string Datum; time_t t; time(&t); ctime_s(DateTime, 0x32, &t); char DateTime[0x32]; string Datum_neu; Datum = std::string (DateTime) ; std::replace (Datum.begin(),Datum.end(),':','.'); Datum_neu=Datum; path = "C:\\" + Datum_neu; _mkdir(path.c_str());// Hier kein Ordner string path2; path2 = "C:\\Wed Feb22 10.30.16 2012"; _mkdir(path2.c_str());//Hier wird ein Ordner erstellt.
Ich hoffe Jemand hat eine Idee.
-
Nutze den Debugger! Setze einen Haltepunkt und schaue dir an, was tatsächlich in
path
steht und wo genau die Unterschiede zu deinem Literal (path2
) sind.
-
Bei
path
ist am Ende des Strings ein Newline. Das mag_mkdir
offensichtlich nicht. Löscht man es händisch raus, wird der Ordner erstellt. Das Newline kommt scheinbar durchctime_s
da rein.EDIT: Jo, ctime_s ist auch so dokumentiert, dass da ein Newline vor der 0 kommt. Du könntest einfach noch ein replace machen (z.B. alle Newline => 0).
-
Es ist generell nicht ratsam, Leerzeichen sowie Punkte und dergleichen in Pfadangaben zu verwenden. Auch wenn Windows dies zulässt, so funktionieren dann ggf. Netzwerkfreigaben oder gewisse Sicherungsmechanismen eben nicht.
Da du hier im MFC-Forum bist, warum, nimmst du nicht CString und baust dir den Pfad mittels CString::Format zusammen. Damit kannst du alle Parameter von CTime dort problemlos integrieren und hast weder Punkte noch was anderes dazwischen.
Beispiel:CString Dateiname; SYSTEMTIME SysTime; GetLocalTime(&SysTime); Dateiname.Format(_T("C:\\%02d%02d%4d_%02d%02d%02d%02d.csv"),SysTime.wDay,SysTime.wMonth,SysTime.wYear,SysTime.wHour,SysTime.wMinute,SysTime.wSecond,SysTime.wMilliseconds);
-
AndyDD schrieb:
Es ist generell nicht ratsam, Leerzeichen sowie Punkte und dergleichen in Pfadangaben zu verwenden. Auch wenn Windows dies zulässt, so funktionieren dann ggf. Netzwerkfreigaben oder gewisse Sicherungsmechanismen eben nicht.
Das ist aber nicht der Fehler (damit will ich deine Alternative aber nicht schlecht reden
). Hier stört lediglich das Newline. Und seit wann funktionieren Netzwerkfreigaben mit Leerzeichen nicht? Ich habe gerade mal nachgesehen, ich habe hier sogar eine mit Leerzeichen.
-
_matze schrieb:
Das ist aber nicht der Fehler (damit will ich deine Alternative aber nicht schlecht reden
).
Machste ja auch nicht. Wir haben das Problem, wenn man über ein Skript gemappte Laufwerke syncronisieren will, dann hat man teilweise selbst bei Win 2011 SBS Probleme, wenn die Netzwerkfreigaben Leerzeichen enthalten. Das kann sicher auch am Kopierprogramm liegen, aber wenn man die weglässt ist es kein Fehler und reduziert solche Effekte in anderen Bereichen. Weiterhin kanns schon mal passieren, dass Virenscanner Dateien aus solchen Pfaden als potenziell bedrohlich einstufen, da die einen Hack mit der Extension vermuten.
Welches NewLine siehst du denn? Ich habs irgendwie nicht gefunden, aber ist ja auch schon spät.
-
AndyDD schrieb:
Welches NewLine siehst du denn? Ich habs irgendwie nicht gefunden, aber ist ja auch schon spät.
Na das Newline am Ende des Strings, vor der 0. Steht auch in der Doku:
The new line character ('\n') and the null character ('\0') occupy the last two positions of the string.
(http://msdn.microsoft.com/en-us/library/4ey61ayt.aspx)
Das mag _mkdir nicht (verständlicherweise). Ersetze ich es per Debugger durch eine 0, wird das Verzeichnis erstellt. Die Kombi ctime_s und _mkdir ist offensichtlich nicht optimal.
-
Gut ok, ich benutze sowas nicht. Wie gesagt ich benutze sowas selten bzw. nicht. Die MFC bzw. die WinAPI bieten andere Mittel, bei denen man vielleicht auch andere Probleme hat.