Logfile anzeigen per Button-Klick
-
Hi,
habe ein kleines Problem:
habe ein MDI-Projekt, mit nem ListCtrl drauf und ich zeige max. 8 bis 12 Zeilen in dem Ctrl an, schreibe aber den Inhalt gleichzeitig in ein .log-File.Ich will nun per Klick auf ein Button dieses File anzeigen (als hätte ich im Explorer nen Doppelklick auf das File gemacht), kann mir da jemand helfen ??
Vllt. per WinExec ? Habe es mal so probiert:if (!(WinExec("MyFile.log", SW_NORMAL))) { error = GetLastError(); AfxMessageBox("Fehler"); }Laut MSDN sucht damit ja die Funktion zuerst im Directory, von dem aus die Anwendung gestartet wurde (wo das Logfile auch liegen soll), nur schlägt die Funktion fehl und GetLastError liefert 32, aber es heißt ja "If the function succeeds, the return value is greater than 31".
Oder wie kann man das noch lösen ??
Thx
-
Verwende ShellExecute "open".
Und gib den gesamten Pfad an! Das Problem ist, dass Du evtl. nict weiß wo das Working-Directory Deiner Applikation steht.
-
Ah ja ok, danke dir !!
Der Aufruf sieht jetzt so aus:
if (!(ShellExecute(NULL, "open", "MyFile.log", NULL, NULL, SW_NORMAL))) { error = GetLastError(); AfxMessageBox("Fehler: %i", error); }4.Parameter: Die MSDN sagt dazu "If lpFile specifies a document file, lpParameters should be NULL"
5.Parameter: "If this value is NULL, the current working directory is used", also wird das Directory benutzt, in dem sich die Applikation befindet.Und es funktioniert, danke !
-
Vorsicht! Der Parameter 5 zielt nicht auf das Verzeichnis der EXE die .log zugeordnet ist, sondern auf "Dein" aktuelles Working-Directory!
Lass diesen Parameter auf NULL und verwende den vollen Pfad in Parameter 2!
-
OK, ist aber nur die Frage, wie ich den Pfad zum File "allgemeiner" angeben kann !?
Der User wird ja z.B. kaum die Anwendung immer auf C: ausführen... !
Ich hoffe, du weißt, wie ich das jetzt meine.
-
Ok, hat sich erledigt, gebe eben als Filename C:\\MyFile.log an
ist ja auch irgendwie logisch...

hoffe bloß dass es mit dem Schreiben auf C: auch keine Probleme gibt... (auch nicht auf anderen Rechnern)Danke für die Hilfe und noch nen schönen Tag !!
-
Klar bekommst Du Probleme. Spätestens unter Vista!
Warum nimmst Du nicht den vorgesehenen CSIDL_APPDATA Bereich?
-
Martin Richter schrieb:
Klar bekommst Du Probleme. Spätestens unter Vista!
Warum nimmst Du nicht den vorgesehenen CSIDL_APPDATA Bereich?
oder so !

Hab da gar nicht dran gedacht !Kannst du mir dazu noch nen kleinen Tipp geben, wie ich das realisiern könnte ??
-
Wer sucht der finder findet... Matth. 7,7

-
So ist es, habs auch grad gelöst, sieht bei mir jetzt so aus:
CFileFind File; TCHAR szPath[MAX_PATH]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath))) { strcat_s(szPath, MAX_PATH, "\\MyFile.log"); if (!File.FindFile(szPath)) hLogFile = CreateFile(szPath, GENERIC_READ, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); else hLogFile = CreateFile(szPath, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); }und es funktioniert so wie es soll !
-
Besser als strcat_s ist IMHO PathCombine
http://msdn.microsoft.com/en-us/library/bb773571(VS.85).aspx
-
Ok, kenn die gar nicht, werd mir die mal anschauen !
Am besten wäre es, wenn ich im Directory C:\Users\username\AppData\Roaming (in Vista, was CSIDL_APPDATA entspricht) noch einen Ordner anlegen könnte mit dem Namen meiner Applikation !
habe zwar schon mit SHCreateDirectoryEx rumprobiert, hab aber vor allem in Vista Probleme mit den Rechten, weil ich mit meiner Anwendung keinen Ordner anlegen kann!
Vllt hast du dazu noch ein Tipp, ich könnte notfalls auch mein Logfile auch einfach im Roaming-Directory ablegen, aber es wäre "ordentlicher", dort ein Ordner anzulegen !

-
und habe auch genauso Probleme, etwas in mein Logfile zu schreiben !
-
Der C:\Users\username\AppData\Roaming ist nicht eingeschgränkt unter Vista!
Du kannst jederzeit dort Pfade anlegen und löschen. Es ist Dein Privater Storage! Du als User hast dort Vollzugriff!
Zeig mal lieber Code, weil ich vermute, dass Du Quatsch machst.
Oder sag uns was GetLastError sagt.
-
Ok, es funktioniert doch, hatte bei CreateFile GENERIC_READ statt eig. GENERIC_WRITE angegeben, so siehts jetzt aus:
BOOL CFeWeatherCamDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; CFileFind File; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath))) { int state = SHCreateDirectoryEx(NULL, szPath, NULL); if (state == ERROR_SUCCESS) strcat_s(szPath, MAX_PATH, "\\MyApp\\MyProject"); strcat_s(szPath, MAX_PATH, "\\MyFile.log"); } else if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, szPath))) strcat_s(szPath, MAX_PATH, "\\MyFile.log"); else strcat_s(szPath, MAX_PATH, "MyFile.log"); PathOK = TRUE; if (!File.FindFile(szPath)) hLogFile = CreateFile(szPath, GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); else hLogFile = CreateFile(szPath, GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hLogFile != INVALID_HANDLE_VALUE) { DWORD dwBytesWritten = 0; CString text = "Hallo"; WriteFile(hLogFile, text, text.GetLength(), &dwBytesWritten, NULL); CanClose = TRUE; } return TRUE; }Nur erstellt er die beiden angegebene Directory in Roaming nicht, liefert als Code 183 zurück, was ERROR_ALREADY_EXISTS entspricht, nur das Directory existiert aber nicht !

und SHCreateDirectory kennt er nicht, nur die ...EX !
-
R3dNeXX schrieb:
int state = SHCreateDirectoryEx(NULL, szPath, NULL); if (state == ERROR_SUCCESS) strcat_s(szPath, MAX_PATH, "\\MyApp\\MyProject");Nur erstellt er die beiden angegebene Directory in Roaming nicht, liefert als Code 183 zurück, was ERROR_ALREADY_EXISTS entspricht, nur das Directory existiert aber nicht !

und SHCreateDirectory kennt er nicht, nur die ...EX !Was würdest Du dazu sagen, zuerst den Pfad zu verändern und dann erst das Verzeichnis anzulegen?

Wenn Du nach dem Pfad fragst und diesen nicht veränderst muss SHCreateDirectoryEx ja melden, dass dieses Verzeichnis schon existiert!
-
Stimmt.

Da habe ich jetzt erst gemerkt !
Hab es jetzt fertig:
BOOL C...Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; CFileFind File; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath))) { strcat_s(szPath, MAX_PATH, "\\MyApp\\MyProject"); SHCreateDirectoryEx(NULL, szPath, NULL); strcat_s(szPath, MAX_PATH, "\\MyFile.log"); } else if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, szPath))) strcat_s(szPath, MAX_PATH, "\\MyFile.log"); else // sonst Logfile im "Working-Directory" der Anwendung erstellen strcat_s(szPath, MAX_PATH, "MyFile.log"); PathOK = TRUE; if (!File.FindFile(szPath)) hLogFile = CreateFile(szPath, GENERIC_WRITE, NULL, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); else hLogFile = CreateFile(szPath, GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hLogFile != INVALID_HANDLE_VALUE) { DWORD dwBytesWritten = 0; CString text = "Test 1 2 3"; WriteFile(hLogFile, text, text.GetLength(), &dwBytesWritten, NULL); CanClose = TRUE; } return TRUE; }Danke für die Hilfe und noch nen schönen Tag !!