Ist Pfad local





  • also mit GetDriveType gehts schonmal nicht, ich bekomm immer den wert 1 zurück... jetzt schau ich mir mal das andere an...

    😞



  • vielen dank für eure hilfe,
    es funktioniert mit PathIsNetworkPath
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb773640.aspx

    sehr gut und macht genau das was ich möchte 🙂

    interessant wäre jetzt noch ob es da auch so eine einfache möglichkeit gibt, den ordner dann zu löschen...
    ich hab schonmal so was ähnliches implementiert aber ohne diese ordner und das war dann sehr viel code.

    gibt es da zufällig auch so eine funktion? ich find da nämlich auch wieder nix. es ist echt schlimm wenn man die ganzen funktionen nicht kennt



  • Alternative hätte man auch einfach prüfen können, ob nach dem ersten Zeichen ein ':\' folgt.



  • Naja, es is dann eigentlich doch ein bissl komplizierter als das: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx 😉



  • hab ein problem und bekomms nicht hin... probiere schon ewig rum da gibts sicher nen trick

    struct _finddata_t c_file;
    struct _finddate_t *ptrc_file;
    long hFile;
    CString suchdir = _T("*.*");
    suchdir.Insert(0,m_strDefaultDirectory);
    
    hFile = _findfirst(suchdir, &c_file )
    

    findfirst macht er jetzt nicht weil er ein problem mit dem suchdir hat...
    error C2664: '_findfirst64i32': Konvertierung des Parameters 1 von 'CString' in 'const char *' nicht möglich

    habt ihr ne idee? hab alles probiert _T(suchdir) geht auch nicht TEXT(suchdir) auch nicht LPTCSTR davor casten geht auch nicht...



  • insert schrieb:

    hab alles probiert _T(suchdir) geht auch nicht TEXT(suchdir) auch nicht LPTCSTR davor casten geht auch nicht...

    lololo geh grundlagen lernen!





  • lololo schrieb:

    insert schrieb:

    hab alles probiert _T(suchdir) geht auch nicht TEXT(suchdir) auch nicht LPTCSTR davor casten geht auch nicht...

    lololo geh grundlagen lernen!

    Du bist ja nett... dich braucht das Forum... Klasse antwort das hilft mir super. Danke ::(

    Hat jemand ne gscheide Antwort wie ich den cstring da rein bekomm?



  • internal schrieb:

    Hat jemand ne gscheide Antwort wie ich den cstring da rein bekomm?

    Ja, Grundlagen lernen! Und plötzlich geht alles wie von alleine! Und du musst uns auch gar nicht mehr mit sowas banalem nerven!



  • Was geht denn mit dir ab.. omg

    Ist es dir nüchtern möglich zu sagen wie es geht?



  • also ich hab mir jetzt das mit den strings ein wenig angeschaut und ausprobiert..

    es geht einfach nicht..

    int sizeOfString = (suchdir.GetLength()+1);
    	LPTSTR lpsz = new TCHAR[sizeOfString];
    	_tcscpy_s(lpsz, sizeOfString, suchdir);
    
    hFile = _findfirst(lpsz, &c_file ))
    

    könnte mir nicht jemand ein paar tips geben wie ich das denn machen soll, damit es funktioniert? ich bekomms nicht gebacken und es ist sicher nur ne kleinigkeit



  • hallo nochmal,

    ich hab jetzt ewig rumprobiert und hab jetzt die Funktion FindFirstFile() genommen, dort kann ich einfach einen cstring verwenden.

    jetzt hab ich aber die nächste konvertierungshürde

    remove((m_strDefaultDirectory+_T("\\")+FindFileData.cFileName)); // geht nicht error C2664: 'std::remove': Konvertierung des Parameters 1 von 'ATL::CStringT<BaseType,StringTraits>' in 'const char *' nicht möglich
    
    RemoveDirectory((m_strDefaultDirectory+_T("\\")+FindFileData.cFileName)); // funktioniert sehr wohl
    

    kann mir bitte jemand helfen, ich weiß nicht wo ich diese konvertierungsgrundlagne lernen soll.ich lern eigentlich nur durch probieren und anwenden. in der fh hatten wir sowas noch nie. hier haben wir immer nur komische pattern programmiert...



  • noch etwas

    remove((m_strDefaultDirectory+"\\"+FindFileData.cFileName));
    // hier bekomm ich keinen compiler fehler aber er löscht mir die ordner nicht...
    

    ich werde noch verrückt mit den konvertierungen, CString, string, char, const char* da checkt doch keiner mehr durch und ich weiß auch nicht wie ich das lernen soll. hab sehr lang gegoogelt und kollegen gefragt die sind sich da meist auch nciht so sicher. kann mir jemand bitte helfen?



  • So ganz unrecht hatte der "Grundlagen lernen"-Typ nicht.
    Ich versuchs mal.
    Ein char ist ein 8-bit signed int (außer wenn du im C-Forum bist).
    Den ersten 128 Werten des chars wird per ASCII-Encoding (www.asciitable.com) ein Zeichen zugeordnet. Ein einzelnes Zeichen macht noch keinen String, deshalb brauchst du mehrere, ein char * bietet sich an, der auf eine Reihe von chars zeigt. Das ist der C-Style mit Strings umzugehen. Die WinAPI besteht aus C-Funktionen, also funktioniert das.
    Nun gibt ein char nur 256 Zeichen her. Das heißt chinesisch ist nicht und schon Umlaute sind nicht portabel. Daher hat Windows eine Art UTF16 eingeführt und dazu gleich wchar_t. Das ist dasselbe wie ein char, nur halt mit 16 Bit und 64k Werten. Dementsprechend gibt es ein wchar_t * um einen String zu bauen. Nun gibt es sowas wie char *s = "Hallo" schon. Für wchar_t benutzt man wchar_t *ws = L"Hallo". Dann gibt es noch TCHAR und _T("Hallo"), das sind nur Macros, die zwischen der char und der wchar_t-Variante wechseln, je nachdem ob Unicode eingestellt ist.
    Ein string ist eine Klasse aus der C++-Bibliothek. Benutzt intern chars. Die WinAPI kann kein C++ und kann daher mit string-Klassen auch nichts anfangen. Es gibt die MFC, die die WinAPI in Klassen steckt. Wenn du nun aber einen string s hast, kannst du einfach s = "hallo" benutzen und dann mit s.c_str() auf den char * zugreifen, den Windows versteht. wstring ist dasselbe, nur mit wchar_t intern. Warum Windows kein tstring definiert ist mir unklar, aber man würde einfach sowas schreiben:

    #ifdef _UNICODE
    #define tstring wstring
    #else
    #define tstring string
    #endif
    

    Die WinAPI-Funktionen verstehen sowohl chars als auch wchar_ts. Man muss ihnen aber sagen, welches man benutzt. Es gibt FindFirstFileA für ASCII = char *, dann gibt es FindFirstFileW für wchar_t *, dann gibt es FindFirstFile das je nach Unicode-Einstellung als FindFirstFileA oder FindFirstFileW definiert wird.
    Ich habe keinen Plan was ein CStringT ist.
    Dann gibt es da noch Arrays von chars (char s[100] = "Hallo";), was kompatibel mit char * ist (Ein Array hat zusätzlich die Länge, die bei Umwandlung in einen Pointer weggeschmissen wird. Andersrum gehts nicht, aus einen char * kann man kein char[] machen, da die Länge weg ist und man sie auch nicht manuell angeben kann).
    Und zuletzt das nette const, dass da sagt, dass die Daten, auf die der const Pointer zeigt, nicht verändert werden sollen.
    Beispiel: strcpy(char *, const char 😉 kopiert ein String in einen anderen. Der erste String wird überschrieben, kann also nicht const sein. Von dem zweiten String wird nur gelesen, der kann also const sein. Man kann als ersten Parameter keinen const char * übergeben, da dann strcpy nicht mehr weiß, was es tun soll. Man kann aber sehr wohl einen char * als zweiten Parameter übergeben. strcpy überschreibt den String der gelesen wird nicht, obwohl er dürfte, aber das ist kein Problem.

    Nächstes: String Operationen

    char *s = "Hallo";
    s[2] = 'o'; //crash
    

    "Hallo" ist eine Konstante, die nicht überschrieben werden kann und s zeigt nur auf "Hallo".

    char s[100] = "Hallo";
    s[2] = 'o'; //funktioniert
    

    "Hallo" ist eine Konstante, s ist ein Array von 100 chars, in dem am Anfang "Hallo" drin steht, und dieses Array kann man verändern.

    char *s = "Hallo";
    char *s2 = "du";
    char *s3 = s + " " + s2; //völliger schwachsinn
    

    Mit s + " " würden zwei Pointer addiert werden, die dann irgendwo hin zeigen. Das ist so großer Schwachsinn, dass es in C und C++ nicht erlaubt ist.

    char *s = "Hallo";
    char *s2 = "du";
    char s3[100];
    sprintf(s3, "%s %s", s, s2); //so gehts richtig
    

    Klassen in C++ überladen ihre Operatoren. Es ist auch in C++ Quatsch Pointer oder Objekte zu addieren, daher treten Funktionen an die Stelle.

    string s = "Hallo";
    s += " du"; //Funktionsaufruf!!!
    

    Du solltes rausfinden was ein CStringT ist und wir man daraus einen char * oder wchar_t * macht, dann funktioniert auch dein Code.

    Ich hoffe das hilft für den Anfang.



  • vielen lieben dank für deine antwort, das hilft mir auf jedenfall weiter. ich habe das zwar schon so ähnlich gelesen doch nicht so gut erklärt bekommen.
    allerdings tun sich bei mir wieder fragen auf..

    warum geht dann:

    RemoveDirectory((m_strDefaultDirectory+_T("\\")+FindFileData.cFileName));
    

    und liefert mir das gewünschte ergebnis?

    Du solltes rausfinden was ein CStringT ist und wir man daraus einen char * oder wchar_t * macht, dann funktioniert auch dein Code.

    Das ist ja mein Problem, ich weiß nicht wie ich das herausfinden soll wie ich das daraus mache 😞



  • ich verzweifle noch, hab zwar zwischendruch was anderes machen müssen doch jetzt hab ich schon wieder ein problem... entweder bin ich zu dumm das alles zu checken oder des ist so kompliziert....

    CString strPathToDelete;
    strPathToDelete = _T("C:\\Downloadordner\\*");
    	SHFILEOPSTRUCT sh;   
    	sh.hwnd = NULL;   
    	sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT; 
    	sh.wFunc = FO_DELETE;                 
    	sh.pFrom = strPathToDelete;  // löscht nur dateeien wenn ich _T("C:\\Downloadordner\\*"); hart hinschreibe... in der variable geht snicht wieso auch immer        
    	sh.pTo = NULL; 
    	sh.hNameMappings = NULL; 
    	sh.lpszProgressTitle = NULL; 
    
    	if (SHFileOperation (&sh) == 0)
    


  • Es ist nicht kompliziert. Das ist genau dasselbe Problem wie vorher. Lies dir mal http://msdn.microsoft.com/en-us/library/windows/desktop/bb759795(v=vs.85).aspx durch. Da steht was dieses sh.pFrom eigentlich ist. Es ist ein char * oder wchar_t * je nach Unicode-Einstellung. Ein CString ist kein wchar_t *. Deswegen funktioniert es nicht. Und selbst _T("C:\\Downloadordner\*") ist falsch. Es muss ein doppelt Null-terminierter String sein. _T("C:\\Downloadordner\*") ist nicht doppelt Null-terminiert, es ist pures Glück dass dahinter noch eine 0 kommt und es funktioniert. _T("C:\\Downloadordner\*\0") wäre korrekt, und das kannst du auch als TCHAR * in einer Variablen übergeben.

    Ich habe nun etwas über CStrings gelesen.

    http://msdn.microsoft.com/en-us/library/awkwbzyc.aspx schrieb:

    CString does not store character data internally as a C-style null-terminated string. Instead, CString tracks the length of character data so that it can more securely watch the data and the space it requires.

    ...

    To use a CString object as a C-style string, cast the object to LPCTSTR. In the following example, the CString returns a pointer to a read-only C-style null-terminated string.

    Das heißt er schmeißt die schöne doppel-Null einfach weg und es geht direkt mit CStrings überhaupt nicht. Du müsstest eine kleine Funktion schreiben:

    TCHAR *CString2TCHAR(const CString s){ //jeder Aufruf überschreibt den String des letzen Aufrufs!!!
    	static TCHAR buffer[1024]; //funktioniert nicht bei Strings länger als 1022 Zeichen
    #ifdef _UNICODE
    	buffer[swprintf(buffer, _T("%s"), (LPCTSTR)s)] = 0;
    #else
    	buffer[sprintf(buffer, _T("%s"), (LPCTSTR)s)] = 0;
    #endif
    	return buffer;
    }
    


  • nwp3 schrieb:

    TCHAR *CString2TCHAR(const CString s){ //jeder Aufruf überschreibt den String des letzen Aufrufs!!!
    	static TCHAR buffer[1024]; //funktioniert nicht bei Strings länger als 1022 Zeichen
    #ifdef _UNICODE
    	buffer[swprintf(buffer, _T("%s"), (LPCTSTR)s)] = 0;
    #else
    	buffer[sprintf(buffer, _T("%s"), (LPCTSTR)s)] = 0;
    #endif
    	return buffer;
    }
    

    Die Lösung hat ein paar Schwächen

    1. swprintf kann als Ergebnis -1 zurückliefern

    2. CString darf max. 1024-2 Zeichen lang sein. Müsste man sicherstellen!

    3. Statisches Array bindet dauerhaft 1024-2 Zeichen und wird ständig überschrieben, was u.U. zu seltsamen Effekten führt (multithreading ?).

    Vorschlag:

    TCHAR *CString2TCHAR(const CString s)
    {
    	LPTSTR lpszData = new TCHAR[s.GetLength()+2]();
    	_tcscpy(lpszData , s);
    
    	return lpszData;
    	// delete[] lpszData;   // don't forget to do this
    }
    

    Bem: Die Doppelnull hier realisiert mit +2.



  • Vorschlag:

    TCHAR *CString2TCHAR(const CString s)
    {
    	LPTSTR lpszData = new TCHAR[s.GetLength()+2]();
    	_tcscpy(lpszData , s);
    
    	return lpszData;
    	// delete[] lpszData;   // don't forget to do this
    }
    

    Bem: Die Doppelnull hier realisiert mit +2.[/quote]

    Vielen Dank ich versuche das später nochmal.
    ABER: Ich tu mir auch so schwer, da in dem Projekt irgendwas anderes eingestellt ist und eingestellt sein muss!

    Ich muss bei CStrings immer _T("") benutzen. ich hab auch schon versucht zu reserchieren warum das so ist, aber auf eine zufriedenstellende lösung bin ich noch nicht gestoßen. 😞
    Es geht wohl darum nur Unicode zu verwenden und kein ANSI.

    Mal ne frage für dummys.. könnte ich nicht einfach auch

    CString test = _T("test");
    test.insert(test.GetLength(), _T("\0"))
    

    sagen anstatt der funktion?? Oder ist das was anderes?


Anmelden zum Antworten