2 Fragen zu boost_filesystem bzgl. bcp und leere Ordner

badday

Erfahrenes Mitglied
Moin zusammen,

ich schreibe gerade an einem Programm und nutze dabei zum ersten mal boost. Dabei habe ich 2 Probleme.

1. bcp scheint nicht zu funktionieren. Ich benötige boost_filesystem inklusive Abhängigkeiten. Um nicht alles in den Projektordner packen zu müssen wollte ich bcp benutzen (das Projekt soll dan "out-of-the-box" kompilierbar sein). Allerdings erhalte ich beim Versuch, bcp zu nutzen folgenden Error:
C:\Users\Administrator>bcp filesystem.hpp in "[projectfolder]\boost" -U badday -P [passwort]
SQLState = 37000, NativeError = 4060
Error = [Microsoft][SQL Native Client][SQL Server]Die von der Anmeldung angeford
erte "filesystem"-Datenbank kann nicht geöffnet werden. Fehler bei der Anmeldung
.
SQLState = 28000, NativeError = 18456
Error = [Microsoft][SQL Native Client][SQL Server]Fehler bei der Anmeldung für d
en Benutzer 'badday'.
Was auch wenig verwundert, da die Datenbank tatsächlich nicht existiert. Was mache ich hier falsch?

2. Ich möchte alle leeren Ordner löschen. Wie kann ich also die leeren Ordner innerhalb eines bestimmten Ordners löschen?
Code:
boost::filesystem::directory_iterator end_itr;
    for ( boost::filesystem::directory_iterator itr(ClientPath);itr != end_itr; itr++)
	{
		if ( boost::filesystem::is_directory(itr->status())&&boost::filesystem::is_empty(*itr))
		{		
			//und nun?                         
	}
}


Vielen Dank!

Gruß,

badday
 
Zuletzt bearbeitet:
Hi.
1. bcp scheint nicht zu funktionieren. Ich benötige boost_filesystem inklusive Abhängigkeiten. Um nicht alles in den Projektordner packen zu müssen wollte ich bcp benutzen (das Projekt soll dan "out-of-the-box" kompilierbar sein). Allerdings erhalte ich beim Versuch, bcp zu nutzen folgenden Error:

Was auch wenig verwundert, da die Datenbank tatsächlich nicht existiert. Was mache ich hier falsch?
Du rufst das falsche Programm auf. (http://msdn.microsoft.com/en-us/library/ms162802.aspx)
2. Ich möchte alle leeren Ordner löschen. Wie kann ich also die leeren Ordner innerhalb eines bestimmten Ordners löschen?
Code:
boost::filesystem::directory_iterator end_itr;
    for ( boost::filesystem::directory_iterator itr(ClientPath);itr != end_itr; itr++)
	{
		if ( boost::filesystem::is_directory(itr->status())&&boost::filesystem::is_empty(*itr))
		{		
			//und nun?                         
	}
}
wie wäre es mit boost::remove() ?

Gruß
 
Das hier funktioniert leider nicht:
Code:
inline void removeEmptyFolders(string ClientPath)
{
     boost::filesystem::directory_iterator end_itr;
    for ( boost::filesystem::directory_iterator itr(ClientPath);itr != end_itr;)
	{
		if ( boost::filesystem::is_directory(itr->status()))
		{
		    if(boost::filesystem::is_empty(itr->path()))
                {											
					boost::filesystem::remove_all(itr->path()); 	
					removeEmptyFolders(ClientPath);
					break;
					               
                }
			else
				++itr;
				
		}
		else
			++itr;		
	}

Bzgl. bcp: Was genau meinst du mit dem "falschen Programm"?


Gruß,

badday
 
Das hier funktioniert leider nicht:
Was heißt denn "es funktioniert nicht"?

Willst du das rekursiv machen? Warum verwendest du dann nicht einfach einen recursive_directory_iterator?
Bzgl. bcp: Was genau meinst du mit dem "falschen Programm"?
Wenn du das Boost Tool bcp aufrufen willst, dann darfst du nicht das Microsoft Tool bcp aufrufen. Hast du dich denn nicht mal gewundert was Boost bcp mit irgendwelchen Datenbanken zu tun hat? ;-]

Gruß
 
Moin,

mit "funktioniert nicht" meinte ich, dass es keinen Effekt hat. Sorry für die tolle Beschreibung. recursive_directory_iterator scheint mir hier sehr sinnvoll. Leider verursacht folgender Code einen Crash (allerdings werden auch die leeren Ordner erst gelöscht):

Code:
inline void removeEmptyFolders(string ClientPath)
{
     boost::filesystem::recursive_directory_iterator end_itr;
    for ( boost::filesystem::recursive_directory_iterator itr(ClientPath);itr != end_itr; ++itr)
	{
		if ( boost::filesystem::is_directory(itr->status())&&boost::filesystem::is_empty(itr->path()))
		{										
					boost::filesystem::remove_all(itr->path()); 	
					removeEmptyFolders(ClientPath);
					break;							
		}
		
		
	}
	
}
Ich weiß nicht warum, schließlich wird ein ungültiger Iterator (ich denke remove_all() macht ihn ungültig) Danach nicht mehr benutzt.

Wenn du das Boost Tool bcp aufrufen willst, dann darfst du nicht das Microsoft Tool bcp aufrufen. Hast du dich denn nicht mal gewundert was Boost bcp mit irgendwelchen Datenbanken zu tun hat?
:-( Oje, kein Kommentar

Allerdings habe ich das Problem, dass ich dieses Programm nicht im kompilierten Zustand habe, weil ich boostpro genutzt habe. Daher meine Frage: bekomme ich das irgendwo schon fertig oder muss ich das selber bauen?

Gruß,

badday
 
Zuletzt bearbeitet:
mit "funktioniert nicht" meinte ich, dass es keinen Effekt hat.
Also bei mir hat es funktioniert. Bist du dir sicher, das die Verzeichnisse wirklich leer sind?
recursive_directory_iterator scheint mir hier sehr sinnvoll. Leider verursacht folgender Code einen Crash
Was für einen Crash? Exceptions kann man fangen und ausgeben....
(allerdings werden auch die leeren Ordner erst gelöscht):

Code:
inline void removeEmptyFolders(string ClientPath)
{
     boost::filesystem::recursive_directory_iterator end_itr;
    for ( boost::filesystem::recursive_directory_iterator itr(ClientPath);itr != end_itr; ++itr)
	{
		if ( boost::filesystem::is_directory(itr->status())&&boost::filesystem::is_empty(itr->path()))
		{										
					boost::filesystem::remove_all(itr->path()); 	
					removeEmptyFolders(ClientPath);
					break;							
		}
		
		
	}
	
}
Ich weiß nicht warum, schließlich wird ein ungültiger Iterator (ich denke remove_all() macht ihn ungültig) Danach nicht mehr benutzt.
Warum verwendest du denn remove_all? Wenn das Verzeichnis leer ist reicht doch remove.

Und wozu das break? Wieso willst du denn die Schleife nach dem ersten leeren Verzeichnis abbrechen?

Der Iterator selbst ist nicht ungültig, aber das Verzeichnis existiert nicht mehr. Benutze no_push().
Allerdings habe ich das Problem, dass ich dieses Programm nicht im kompilierten Zustand habe, weil ich boostpro genutzt habe. Daher meine Frage: bekomme ich das irgendwo schon fertig oder muss ich das selber bauen?
Keine Ahnung. Evtl. findet man irgendwo ein Binary für win32...

Gruß
 
Moin,

hier die Ausgabe der abgefangenen Exceptions:
Code:
boost::filesystem::is_empty: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids"
boost::filesystem::basic_directory_iterator constructor: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids"
boost::filesystem::basic_directory_iterator constructor: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids\Vids"
Ja, die Verzeichnisse sind leer, sie werden auch gelöscht.
Welche Version hat bei dir funktioniert?

Dieser Code ist der, der die exceptions wirft:
Code:
inline void removeEmptyFolders(string ClientPath)
{
	try{
     boost::filesystem::recursive_directory_iterator end_itr;
    for ( boost::filesystem::recursive_directory_iterator itr(ClientPath);itr != end_itr; ++itr)
	{
		if ( boost::filesystem::is_directory(itr->status())&&boost::filesystem::is_empty(itr->path()))
		{										
					boost::filesystem::remove(itr->path()); 	
					removeEmptyFolders(ClientPath);					
												
		}
		
		
	}}
	catch (exception& e)
  {
    cout << e.what() << endl;
  }
	
}


Vielen Dank.


Gruß,

badday
 
Hi.
hier die Ausgabe der abgefangenen Exceptions:
Code:
boost::filesystem::is_empty: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids"
boost::filesystem::basic_directory_iterator constructor: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids"
boost::filesystem::basic_directory_iterator constructor: Zugriff verweigert: "C:\Users\Administrator\Desktop\ClientOrdner\Vids\Vids"
verwende no_push. Ich hab auch mal ein Beispiel mit boost::filesystem und no_push gepostet.
Welche Version hat bei dir funktioniert?
der aus Beitrag #3.

Gruß
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück