datei suche

  • Themenstarter Themenstarter dacoma
  • Beginndatum Beginndatum
Nja ich weiß nicht ganz wie dein String am Ende aussehen soll ...

C++:
#include <windows.h>
#include <iostream>
#include <string>


int main()
{
    char buffer[1024];
    const DWORD result(::GetLogicalDriveStringsA(1024, buffer));
    if (result > 1024) { std::cerr << "FEHLER: Buffer zu klein!"; return 1; }
    else if (result == 0) { std::cerr << "FEHLER: Kein Laufwerk gefunden!"; return 1; }

    for (char* ptr_item = buffer; *ptr_item; ptr_item += std::strlen(ptr_item) + 1)    
    {
        std::string current_drive(ptr_item);
        current_drive.append("//*");
        std::clog << current_drive << std::endl;

        _tSearchPath(current_drive.c_str());
    }
   
    std::cin.get();
}
... so mal einfach deinem Code folgend ...
 
Hey,

super Danke! Jetzt findet er auch etwas! Die Ausgabe ist aber sehr komisch!

Mein Quelltext sieht jetzt folgendermaßen aus:

Code:
#define SEARCH_FOLDER "D:\\Suche\\*"

int _tmain(int argc, _TCHAR* argv[])
{
	WIN32_FIND_DATA FData;
	HANDLE hSearch = FindFirstFile(_T(SEARCH_FOLDER),&FData);
	BOOL MoreFiles = FALSE;
	int cnt_file = 0, cnt_dir = 0;
	
	if (hSearch == INVALID_HANDLE_VALUE) return -1;

	do 
	{ 
		// Ist das ein Ordner ?
		if (FData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
		{ 
			// Den Ordnernamen ausgeben
			cout<<"(Ordner) "<<FData.cFileName<<endl; 
			cnt_dir++; // Ordnerzähler um 1 erhöhen
		}

		// Wenn nicht
		else 
		{
			// Den Dateinamen ausgeben
			cout<<"(Datei) "<<FData.cFileName<<endl; 
			cnt_file++; // Dateizähler um 1 erhöhen 
		} 
		MoreFiles = FindNextFile(hSearch,&FData); 
	} while (MoreFiles); 

	FindClose(hSearch); 

	cout<<endl<<"Insgesamt"<<endl
	<<"Ordner: "<<cnt_dir<<endl
	<<"Dateien: "<<cnt_file;

	_getch();
		
	return 0;
}

Da bekomm ich folgende Ausgabe:

(Ordner) 0012FD3C
(Ordner) 0012FD3C
(Datei) 0012FD3C

Insgesamt
Ordner: 2
Dateien: 1

In dem Ordner Suche existiert allerdings nur eine einzige Test.txt Datei!

Wenn ich das define wie folgt implementiere:

Code:
#define SEARCH_FOLDER "D:\\Suche\\Test.txt"

bekomme ich folgende Ausgabe:

(Datei) 0012FD3C

Insgesamt
Ordner: 0
Dateien: 1

Warum sieht denn die Ausgabe so blöd aus? Warum zeigt der mir nur Hex-Zahlen an und nicht den Dateinamen? Vor allem bei der ersten Ausgabe? Was findet er denn da für Ordner und alles? Ich versteh das leider net.

Gruß
Dorschty

Ps.:Danke für deine Geduld mit mir! :)

Hab das selbe Problem. und will keinen neuen Thread dafür aufmachen. Weiß einer wie ich dies ändern kann?
 
Hab das selbe Problem. und will keinen neuen Thread dafür aufmachen. Weiß einer wie ich dies ändern kann?
Du hast vermutlich die UNICODE Unterstützung aktiviert und demnach versucht einen wchar_t* auszugeben, dabei wird dann nur die Adresse des Zeigers ausgegeben.

Entweder du konvertierst die wide-char Strings zu normalen Strings, verwendest für die Ausgabe wcout, wcerr usw. oder du schaltest die Unicode Unterstützung aus. \edit: Oder verwende eine der generischen Ausgabefunktionen _tprintf, _putts zur Ausgabe der gefundenen Dateinamen.

Gruß
 
Zuletzt bearbeitet:
Danke für die Antwort.

Habe nun wcout genommen.

Wie kann ich den nun mit den Dateinamen arbeiten ohne Strings zu benutzen und Unicode auszuschalten.

z.B ich hab in dem Ordner die Dateien:

xyz.mp3
xyz_1.mp3
xyz_2.mp3
xyz_3.mp3
........

Nun soll xyz.mp3 in xyz_4.mp3 umbenannt werden. Die Zahlnendung hängt davon ab wieviele DAteien bereits vorhanden sind. bzw. was die nächste Zahl in der Reihenfolge ist. Dazu würde ich jetzt schauen, wie oft "xyz_" im Dateinamen vorkommt , und so die nächste Zahl ermitteln.

Das umbenenne würde ich mit

C++:
errno_t err = rename(filename, newname);
machen.

Letztendlich soll es für eine Logfile Rotation dienen.
Oder gibt es da schon was fertiges
 
Zuletzt bearbeitet:
Wie kann ich den nun mit den Dateinamen arbeiten ohne Strings zu benutzen und Unicode auszuschalten.
Du verwendest grundsätzlich die generischen Funktionen und Typen aus tchar.h. Siehe http://msdn.microsoft.com/en-us/library/tsbaswba(VS.80).aspx
Nun soll alarm.mp3 in alarm_4.mp3 umbenannt werden. Die Zahlnendung hängt davon ab wieviele DAteien bereits vorhanden sind. bzw. was die nächste Zahl in der Reihenfolge ist. Dazu würde ich jetzt schauen, wie oft "alarm_" im Dateinamen vorkommt , und so die nächste Zahl ermitteln.

Das umbenenne würde ich mit

C++:
errno_t err = rename(filename, newname);
machen.
Das würde nicht funktionieren. Du mußt _trename verwenden.

Gruß
 
Habe gerade so etwas geschrieben, vielleicht hilfts...

Code:
void CFile::search(fstream &FS) {
	
	char savepath[MAX_PATH];	// zur Zwischenspeicherung des Pfades
	int len;
	
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;
	strcpy(savepath, path);		// Sicherung des Pfades
	strcat(path, "\\*");
	hFind = FindFirstFile(path, &FindFileData);
	if(hFind == INVALID_HANDLE_VALUE) {
		cout << "Datei nicht vorhanden oder anderer Fehler..." << endl << "GetLastError: " << GetLastError () << endl;
	} 
	else {
		do {
			int result = strcmp(FindFileData.cFileName, "."); 
			int result2 = strcmp(FindFileData.cFileName, ".."); 
			if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && result != 0 && result2 !=0) {
				len=strlen(path);
				strcpy(&path[len-2], "\0");
				strcat(path, FindFileData.cFileName);
				strcat(path, "\\");
				search(FS);
				strcpy(path, savepath);
				strcat(path, "\\*");
			}
			else {
				char file_end[MAX_PATH];
				strcpy(file_end,FindFileData.cFileName);
				len=strlen(file_end);
				strcpy(&file_end[len-4], "\0");
				strcat(file_end, type);
				if((strcmp(file_end, FindFileData.cFileName)) == 0) {
					cout << savepath << FindFileData.cFileName << endl;
				}
			}
		} while(FindNextFile(hFind, &FindFileData));
	}
	FindClose(hFind);
}// end search

Ich wollte Datein und habe mir diesen Quellcode von oben rausgesucht

Code:
#include <vcl.h>
#include <iostream>
#include <windows.h>
using namespace std;
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}

void CFile::search(fstream &FS) {

	char savepath[MAX_PATH];	// zur Zwischenspeicherung des Pfades
	int len;

	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;
	strcpy(savepath, path);		// Sicherung des Pfades
	strcat(path, "\\*");
	hFind = FindFirstFile(path, &FindFileData);
	if(hFind == INVALID_HANDLE_VALUE) {
		cout << "Datei nicht vorhanden oder anderer Fehler..." << endl << "GetLastError: " << GetLastError () << endl;
	}
	else {
		do {
			int result = strcmp(FindFileData.cFileName, ".");
			int result2 = strcmp(FindFileData.cFileName, "..");
			if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && result != 0 && result2 !=0) {
				len=strlen(path);
				strcpy(&path[len-2], "\0");
				strcat(path, FindFileData.cFileName);
				strcat(path, "\\");
				search(FS);
				strcpy(path, savepath);
				strcat(path, "\\*");
			}
			else {
				char file_end[MAX_PATH];
				strcpy(file_end,FindFileData.cFileName);
				len=strlen(file_end);
				strcpy(&file_end[len-4], "\0");
				strcat(file_end, type);
				if((strcmp(file_end, FindFileData.cFileName)) == 0) {
					cout << savepath << FindFileData.cFileName << endl;
				}
			}
		} while(FindNextFile(hFind, &FindFileData));
	}
	FindClose(hFind);
}// end search
//---------------------------------------------------------------------------

Dies ist mein Programm mit eingefügten Quelltext.

Als Fehler kommt:

//////
[BCC32 Fehler] Unit1.cpp(20): E2090 Qualifizierer 'CFile' ist kein Name einer Klasse oder eines Namespace
[BCC32 Fehler] Unit1.cpp(20): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
/////

Ich muss dazu sagen ich komme von Delphi und habe mir jetzt c++ vorgenommen. Ich habe die Grundlagen mit einem Buch gelernt. Und bin jetzt dabei alle Programme in c++ nachzuschrieben. Das einzigste Problem ist eben das ich eine Suchroutine benötige.Welche

alle *.avi mit Dateiname und Pfad in einer ListBox auflistet.


P.S.: Ich wäre auch Dankbar über ein Tutorial zur Datei arbeit oder ein gutes Buch.
 
Als Fehler kommt:

//////
[BCC32 Fehler] Unit1.cpp(20): E2090 Qualifizierer 'CFile' ist kein Name einer Klasse oder eines Namespace
[BCC32 Fehler] Unit1.cpp(20): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
/////
Wie bereits da steht, du hast weder eine Klasse noch einen Namensraum der "CFile" heißt definiert.

Deshalb kannst du auch nicht definieren, das es eine Methode namens search für diese Klasse oder Namensraum geben soll.

Lass einfach das "CFile::" bei der Definition weg.

Ist dir außerdem bewußt das in dem Code den du ausgewählt hast noch ein paar Fehler sind, über die wir in dem Thema diskutiert hatten?!

Gruß
 
Zurück