FindFirstFile, LPCTSTR lpFileName, problem z poprawną ścieżką

0
	HANDLE check = NULL;

	check = FindFirstFile((LPCWSTR)"D:\\CB\\new.txt", NULL);

	if(GetLastError() == ERROR_FILE_NOT_FOUND) printf("...");

Próbowałem już różnych sposobów, konwertować to wieloma metodami, podawać inne ścieżki, ale nadal konsola pokazuje mi język :\

Google nie pomogły, chociaż to pewnie moja wina. Starałem się manipulować ścieżką jak to tylko możliwe

Chcę potrenować z funkcjami WINAPI na plikach, i na razie zdziałałem zabawę z OpenFile :\

0

Zamiast

check = FindFirstFile((LPCWSTR)"D:\\CB\\new.txt", NULL);

sprobujcheck = FindFirstFile(L"D:\CB\new.txt", NULL);

0

Próbowałem, wita mnie wielki wykrzyknik z napisem

"Unhandled Exception at XXXXXXX (kernelBase.dll) in X.exe (XXXXXXX)

Generalnie Acces Violation

0

Dlaczego jako parametr funkcji FindFirstFile podajesz NULL? System próbuje pod ten wskaźnik zapisać strukturę, która zawiera informacje o wyszukiwaniu.

Zajrzyj z łaski swojej do dokumentacji.

Już nie mówiąc o tym, że sprawdzanie istnienia pliku funkcją do wyszukiwania jest co najmniej dziwne.

0
Rev napisał(a):

Dlaczego jako parametr funkcji FindFirstFile podajesz NULL? System próbuje pod ten wskaźnik zapisać strukturę, która zawiera informacje o wyszukiwaniu.

Zajrzyj z łaski swojej do dokumentacji.

Myślałem, że można

Rev napisał(a):

Już nie mówiąc o tym, że sprawdzanie istnienia pliku funkcją do wyszukiwania jest co najmniej dziwne.

Propo to przypomniałeś mi o czymś takim jak OF_EXIST

file = OpenFile("baza.txt", &fileinfo, OF_EXIST);
	if(GetLastError() == 0) printf("Thx :)");

Działa, dzięki ;)

Problem rozwiązany, ale mam jeszcze coś co mnie martwi:

// List.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <conio.h>

int main()
{
	LPWIN32_FIND_DATA w32struct;
	HANDLE check = NULL;

	check = FindFirstFile(L"C:\\baza.txt", (LPWIN32_FIND_DATAW) &w32struct);
	printf("%u", GetLastError());

	getch();

	return 0;
}

ERROR 0 - sukces, natomiast po wciśnięciu klawisza:
stack around the 'w32struct' variable was corrupted
If there is a handler around that variable, the program may be safely continued

Hmm... źle wprowadzam strukturę do funkcji, natomiast bez jej konwersji jest to nie możliwe... (kompilator mógł by mieć taki odgłos avasta by bardziej irytować niedoszłych programistów :P)

1

Przede wszystkim nie trzeba otwierać pliku, żeby sprawdzić czy istnieje. Można zwyczajnie użyć funkcji PathFileExists z Shlpwapi.h (trzeba dołączyć Shlpwapi.lib).

W każdym razie, jak chcesz korzystać z win api to wypadałoby 1. nauczyć się korzystać z dokumentacji, 2. ogarnąć podstawy. Będziesz popełniał takie głupie błędy dopóki nie będziesz wiedział, że LP w nazwie typu oznacza, że to tylko wskaźnik, a W na końcu typu lub funkcji oznacza, że to wersja unicode i nie powinno się mieszać tych typów (najlepiej korzystać z makr, które nie mają na końcu ani W ani A i same dokleją co trzeba na podstawie zdefiniowanych makr UNICODE i _UNICODE). Napis w C to niby char*, a w win api mamy LPSTR, LPTSTR, LPCTSTR, LPWSTR i tak dalej; mamy makro TEXT, mamy prefiks L.

Jak będziesz rzutował wszystko na podstawie rzutu kością to niewiele ci wyjdzie.

#include <cstdio>
#include <Windows.h>
#include <tchar.h>
#include <Shlwapi.h>

int main()
{
	LPCTSTR file_name = TEXT("C:\\costam.txt");

	_tprintf(TEXT("File \"%s\" %s.\n"), file_name, PathFileExists(file_name) ? TEXT("exists") : TEXT("does not exist"));

	WIN32_FIND_DATA find_data;
	HANDLE handle;

	if((handle = FindFirstFile(file_name, &find_data)) == INVALID_HANDLE_VALUE)
		return GetLastError() == ERROR_FILE_NOT_FOUND ? 1 : 2;

	FindClose(handle);

	unsigned long long file_size = find_data.nFileSizeHigh * (MAXDWORD + 1) + find_data.nFileSizeLow;
	
	_tprintf(TEXT("File size of \"%s\" is %d bytes.\n"), file_name, file_size);

	return 0;
}

Kod jest zgodny i z ANSI i z Unicode.

1 użytkowników online, w tym zalogowanych: 0, gości: 1