Προς το περιεχόμενο

FindFirstFile() error c++


realez

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Προσπαθώ να βρω ένα τρόπο για να βάλω σε μία λίστα τα path κάποιον txt και κατέληξα στην FindFirstFile() και FindNextFile(). Νομίζω πως αυτές ταιριάζουν στο σκοπό μου πείτε μου αν είμαι λάθος. Η κατάσταση είναι η παρακάτω. Έχω ένα φάκελο με όνομα mama. Αυτος ο φάκελος περιέχει 3 φακέλους το child1, child2 kai child3 o καθένας από τους οποίους περιέχει μερικά txt των οποίων τα path θέλω να βάλω στη λίστα ώστε να τα χρησιμοποιήσω μετά ένα ένα. Το πρόβλημα μου είναι πως προσπαθώ να πειραματιστώ με το FindFirstFile(), το FindNextFile() κτλπ  αλλά μου εμφανίζει το παρακάτω error.:  Error    1    error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'char [50]' to 'LPCWSTR' . Καμία ιδέα;

By the way χρησιμοποιώ visual studio 2008

 

Edit:

Λύσει στο error βρήκα σε περίπτωση που το χρειαστεί κάποιος:

Για να λυθεί το error properties του project ->general->character set αλλαγή από unicode σε not set (ελπίζω αυτό να μην επηρεάσει κάτι άλλο όταν το κάνω στον βασικό κώδικα)

Βρήκα πως λειτουργεί giα να υλοποιήσω αυτό που έγραψα παραπάνω αλλά τα προβλήματα συνεχίζουν  να υπάρχουν.

Άμα στη θέση του s(εκεί που είναι το βελάκι ) βάλω το περιεχόμενό του δηλαδή "C:/Users/john/Desktop/mama/*"

λειτουργεί. Άμα όμως βάλω το string s  βγάζει το εξείς error: Error    1    error C2664: 'FindFirstFileA' : cannot convert parameter 1 from 'std::string' to 'LPCSTR'   Μιάζει κάπως με το προηγούμενο. Το θέμα είναι πως το path πρέπει να το παίρνω από το χρήστη όποτε θα το βάζω μέσα σε ενα string.

 Επίσης τα 2 πρώτα που παίρνει με το FindFirstFile και το FindNextFile είναι τελείες για αυτό έχω βάλει τα 2 πρώτα να γίνονται έτσι χωρίς να τα χρησιμιοποιώ. Αναγκαστικά έτσι γίνεται η υπάρχει κάποια λύση σε αυτό?

Ευχαριστώ :)
 

 

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <tchar.h>
#include <stdio.h>
using namespace std;

struct pathname
{
    string path;
    pathname *next;
};


int main()
{
    pathname *head = new pathname;
    pathname *temp = head;
    WIN32_FIND_DATA fData;
    string s = "C:/Users/Manos/Desktop/mama/*";
    void * handle = FindFirstFile( s, &fData ); //<~~~~~~~~~~~~
    FindNextFile(handle, &fData);//meta apo auto emfanizei ta onomata
    FindNextFile(handle, &fData);
    temp->next = 0;
    temp->path = fData.cFileName;
    while (FindNextFile(handle, &fData) != 0) //swsto listing
    {    
          temp->next = new pathname;
          temp = temp->next;
          temp->next = 0;
          temp->path = fData.cFileName;
    }
    temp = head;
    cout <<"edw arxizei" <<endl;
    while(temp != 0)
    {
        cout << temp->path << endl;
        temp = temp->next;
    }
    system("pause");
}
Επεξ/σία από realez
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Προσπαθώ να βρω ένα τρόπο για να βάλω σε μία λίστα τα path κάποιον txt και κατέληξα στην FindFirstFile() και FindNextFile(). Νομίζω πως αυτές ταιριάζουν στο σκοπό μου πείτε μου αν είμαι λάθος. Η κατάσταση είναι η παρακάτω. Έχω ένα φάκελο με όνομα mama. Αυτος ο φάκελος περιέχει 3 φακέλους το child1, child2 kai child3 o καθένας από τους οποίους περιέχει μερικά txt των οποίων τα path θέλω να βάλω στη λίστα ώστε να τα χρησιμοποιήσω μετά ένα ένα. Το πρόβλημα μου είναι πως προσπαθώ να πειραματιστώ με το FindFirstFile(), το FindNextFile() κτλπ  αλλά μου εμφανίζει το παρακάτω error.:  Error    1    error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'char [50]' to 'LPCWSTR' . Καμία ιδέα;

By the way χρησιμοποιώ visual studio 2008

 

Edit:

Λύσει στο error βρήκα σε περίπτωση που το χρειαστεί κάποιος:

Για να λυθεί το error properties του project ->general->character set αλλαγή από unicode σε not set (ελπίζω αυτό να μην επηρεάσει κάτι άλλο όταν το κάνω στον βασικό κώδικα)

Βρήκα πως λειτουργεί giα να υλοποιήσω αυτό που έγραψα παραπάνω αλλά τα προβλήματα συνεχίζουν  να υπάρχουν.

Άμα στη θέση του s(εκεί που είναι το βελάκι ) βάλω το περιεχόμενό του δηλαδή "C:/Users/john/Desktop/mama/*"

λειτουργεί. Άμα όμως βάλω το string s  βγάζει το εξείς error: Error    1    error C2664: 'FindFirstFileA' : cannot convert parameter 1 from 'std::string' to 'LPCSTR'   Μιάζει κάπως με το προηγούμενο. Το θέμα είναι πως το path πρέπει να το παίρνω από το χρήστη όποτε θα το βάζω μέσα σε ενα string.

 Επίσης τα 2 πρώτα που παίρνει με το FindFirstFile και το FindNextFile είναι τελείες για αυτό έχω βάλει τα 2 πρώτα να γίνονται έτσι χωρίς να τα χρησιμιοποιώ. Αναγκαστικά έτσι γίνεται η υπάρχει κάποια λύση σε αυτό?

Ευχαριστώ :)

 

 

 

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <tchar.h>
#include <stdio.h>
using namespace std;

struct pathname
{
    string path;
    pathname *next;
};


int main()
{
    pathname *head = new pathname;
    pathname *temp = head;
    WIN32_FIND_DATA fData;
    string s = "C:/Users/Manos/Desktop/mama/*";
    void * handle = FindFirstFile( s, &fData ); //<~~~~~~~~~~~~
    FindNextFile(handle, &fData);//meta apo auto emfanizei ta onomata
    FindNextFile(handle, &fData);
    temp->next = 0;
    temp->path = fData.cFileName;
    while (FindNextFile(handle, &fData) != 0) //swsto listing
    {    
          temp->next = new pathname;
          temp = temp->next;
          temp->next = 0;
          temp->path = fData.cFileName;
    }
    temp = head;
    cout <<"edw arxizei" <<endl;
    while(temp != 0)
    {
        cout << temp->path << endl;
        temp = temp->next;
    }
    system("pause");
}

 

 

Δοκίμασε να αλλάξεις το s σε s.c_str() ώστε να λάβεις το string σου σε μορφή char.

 

Ακολουθεί μια τροποποιημένη έκδοση που χρησιμοποιεί UNICODE (γραμμένη σε C++ Builder):

 

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <tchar.h>
#include <stdio.h>
using namespace std;

struct pathname
{
	wstring path;
	pathname *next;
};


int main()
{
	wstring s = L"C:/Users/Manos/Desktop/mama/*";

	WIN32_FIND_DATAW fData;
	HANDLE hFF = NULL;

	if((hFF = FindFirstFileW( s.c_str(), &fData )) != INVALID_HANDLE_VALUE)
	{
    	pathname *head = new pathname;
		pathname *temp = head;

		do
		{
			// Skip virtual directories . & ..
			const wstring wDirName(fData.cFileName);

			if(wDirName == L"." || wDirName == L"..")
				continue;

			temp->next = new pathname;
			temp = temp->next;
			temp->next = 0;
			temp->path = fData.cFileName;
		}while(FindNextFileW(hFF, &fData));

		temp = head;

		cout <<"edw arxizei" <<endl;
		while(temp != 0)
		{
			wcout << temp->path << endl;
			temp = temp->next;
		}

	}
	else
		wcerr << "FindFirstFileW error!"<<endl;

	system("pause");
}

 

 

Υ.Γ.

Όταν διαχειρίζεσαι διαδρομές και ονομασίες αρχείων καλό είναι να προτιμάς πλέον το UNICODE διότι το NTFS το υποστηρίζει πλήρως και υπάρχουν περιπτώσεις που μπορεί να προκύψουν προβλήματα στην διαχείριση αρχείων και διαδρομών όταν χρησιμοποιούν UNICODE χαρακτήρες που δεν μπορούν να μετατραπούν (αυτόματα) σε ASCII μορφή.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Νομίζω εδώ ( http://stackoverflow.com/questions/8044506/how-to-convert-from-lpcstr-to-lpcwstr-in-c) θα σου λυθεί το πρόβλημα. Επίσης ο δεύτερος που απαντάει δίνει κι ένα link στο MSDN, καλό είναι να το διαβάσεις για να καταλάβεις για ποιο λόγο παίρνεις το error και πως δουλεύουμε με Unicode ή ANSI στο win32 API

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χρησιμοποίησε std::wstring όπως λέει και ο Directx για να αποθηκεύσεις το file path και μετέτρεψέ το σε std::string αν χρειάζεται. Και για handle αν έχεις πρόβλημα δοκίμασε την Κλάση (με κεφαλαίο) Handle h = FindFirstFile(s, &fdata);

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...