datei suche

D

dacoma

Hallo..

ich bin dabei ein kleines Programm zu schreiben mit dem ich auf meiner Festplatte nach allen zip Files suchen kann + alle ausgeben oder nach einem bestimmten zip File suchen kann..
Leider komme ich jetzt nicht mehr weiter und ich hoffe das mir jemand dabei helfen könnte !
Hier jetzt das was ich bis jetzt realisiert habe :

#include <iostream>
#include <windows.h>
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<screenhelp.h>
using namespace std;

//---------------------Deklaration der Funktionen-------------------------------
int Suche();
int Ausgabe();
void Menue();
//--------------------------Main------------------------------------------------
main()

{
Menue();
Ausgabe();
Suche();
}

//-------------------Definition der Funktionen----------------------------------

//----------------------- Menue ------------------------------------------------
void Menue()
{
char z;
do
{
cout<<endl<<"---------------------------Menueprogramm-------------------------------"<<endl;
cout<<endl<<"Nach Eingabe des Anfangsbuchstaben + Enter erhalten Sie Informationen !"<<endl;
cout<<endl<<"(1)Suche"<<endl;
cout<<endl<<"(2)Ausgabe"<<endl;
z=getch();
switch(z)
{
case '1': Suche(); break;
case '2': Ausgabe(); break;

}
}while(z!='3');


}
//----------------------- Suche ------------------------------------------------
int Suche()
{

WIN32_FIND_DATA FData;
HANDLE hSearch = FindFirstFile("C:\\C\\*12345678*",&FData);
BOOL MoreFiles = FALSE;
int cnt_dir = 0, cnt_file = 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;

cin.get();
return 0;
}

//------------------- Ausgabe aller zip Files ----------------------------------

int Ausgabe()
{
WIN32_FIND_DATA FData;

HANDLE hSearch = FindFirstFile("C:*.zip*",&FData);
BOOL MoreFiles = FALSE;
int cnt_dir = 0, cnt_file = 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;

cin.get();
return 0;
}

Vielen Dank schonmal !
 
Du kannst die gefundenen Dateinamen zum Teil oder komplett, wie du's brauchst mit einem anderen String vergleichen.

Unter C nehme ich je nach Bedarf eine der Funktionen: memcmp/strcmp oder strncmp.

Kannst du in C++ genauso nehmen. Falls FData.cFileName kein char-array ist ,musst du auf char* casten.

Ich hoffe das hilft dir weiter.

Sabst
 
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
 
Hallo,

ich habe ein ähnliches Problem! Ich versuche zunächst einfach eine Datei in einem Verzeichnis zu finden und den Pfad davon mit anzugeben. Das Programm wird dann später noch erweitert.
Ich habe mich an dem oben genannten Quelltext bedient und folgedes zusammengestellt:

Code:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include "iostream"
#include "ctype.h"

using namespace std;

#define SEARCH_FOLDER "D:\Suche"

int _tmain(int argc, _TCHAR* argv[])
{
	WIN32_FIND_DATA FData;
	HANDLE hSearch = FindFirstFile("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;
}

Wenn ich jetzt debugge, kommt folgender Error:
dateisuche.cpp(18) : error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char [14]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast.

Ich habe die Zeile mit dem Error fett markiert. Kann mir jemand bei dem Fehler helfen und mir sagen, was ich falsch mache? Ich weiß es leider nicht.

Danke und Gruß
Dorschty
 
Du hast in deinen Projekteinstellungen wahrscheinlich Unicode, etc. aktiviert, was dazu führt, dass nur die Unicode Funktionen ( von der WinAPI ) benutzt werden.

Lösungsweg #1: Unicode deaktivieren.
Lösungsweg #2: An allen WinAPI Funktionen ein A hinten dranhängen.

D.h.: FindFirstFileA(..);
 
Hi Teambeta,

danke schonmal für deine Antwort.
Ich habe das A hinter FindFirstFile angehängt, aber dann bekomme ich folgenden Fehler:
dateisuche.cpp(18) : error C2664: 'FindFirstFileA' : cannot convert parameter 2 from 'WIN32_FIND_DATA *__w64 ' to 'LPWIN32_FIND_DATAA'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Wie ich Unicode deaktiviere, weiß ich leider auch nicht.

Gruß
Dorschty
 
Hi.

Ob die Funktion FindFirstFileA oder FindFirstFileW aufgerufen wird, passiert automatisch.

Du mußt einfach die Stringliterale in _T() einfassen:
C:
FindFirstFile("abc"); // nicht so
FindFirstFile(_T("abc")); // sondern so
Das funktioniert unabhängig davon ob du Unicode oder MBCS oder ANSI Zeichensätze verwendest.

Gruß
 
Hey deepthroat,

vielen Dank! Jetzt sind zumindest die Fehler weg! :)
Allerdings beendet er das Programm an folgender Stelle:

Code:
if (hSearch == INVALID_HANDLE_VALUE) return -1;

Das heißt ja dann so viel, wie er findet nichts und beendet deswegen! Allerdings ist in dem Verzeichnis eine test.txt Datei. Warum findet er die nicht?

Gruß
Dorschty
 
Hey deepthroat,

vielen Dank! Jetzt sind zumindest die Fehler weg! :)
Allerdings beendet er das Programm an folgender Stelle:

Code:
if (hSearch == INVALID_HANDLE_VALUE) return -1;

Das heißt ja dann so viel, wie er findet nichts und beendet deswegen! Allerdings ist in dem Verzeichnis eine test.txt Datei. Warum findet er die nicht?
Weil du nicht nach ihr suchst. Du suchst nach SEARCH_FOLDER. Damit die Präprozessorvariable expandiert wird, darfst du sie nicht in Anführungszeichen schreiben:
C:
#define SEARCH_FOLDER "d:/suche"
...
FindFirstFile(_T(SEARCH_FOLDER), ...);
Gruß

PS: Bitte achte darauf, das umgekehrte Schrägstriche innerhalb von Strings Spezialzeichen sind und entwertet werden müssen:

C:
"d:\suche" // nicht so
"d:\\suche" // sondern so
Du kannst auch stattdessen normale Schrägstriche verwenden.
 
Zuletzt bearbeitet:
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! :)
 

Neue Beiträge

Zurück