Logfile anzeigen per Button-Klick



  • 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 !!


  • Mod

    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 ??


  • Mod

    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 !


  • Mod

    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 !


  • Mod

    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 !


  • Mod

    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 !!


Anmelden zum Antworten