WinAPI SetFileTime()

0

Jest to program konsolowy, jednak użyłem w nim funkcji z WinAPI. Problem z tym, że f-cja SetFileTime nie działa, tzn. zawsze zwraca fałsz. Nigdy nie zajmowałem się tak na "serio" WinAPI, dlatego może być to jakiś głupi błąd. Proszę o pomoc :)

Oto kod:

#include <errno.h> 
#include <dirent.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h>
#include <time.h>
#include <windows.h>

int main() {

	DIR *pdir;
	dirent *pent;
	char kat[30];
	
	HANDLE plik;
	
	printf("Podaj nazwe katalogu: ");
	scanf("%s", kat);
	pdir=opendir(kat);
	
	if (!pdir){
		printf ("Oooops");
		getch();
		exit(1);
	}

	errno=0;
	
	
	pent=readdir(pdir);
	pent=readdir(pdir);
	pent=readdir(pdir);
	LPSTR nazwapliku = pent->d_name;
	printf("\n%s",nazwapliku);
	
	plik = CreateFile(nazwapliku, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
	
	FILETIME ft;
	SYSTEMTIME st;

	GetSystemTime(&st);
	SystemTimeToFileTime(&st, &ft);
	
	if( SetFileTime(plik, &ft, &ft, &ft) )
		printf(" - zapisano\n");
	else
		printf(" - niezapisano\n");
	
	if (errno){
		printf ("Ooops");
		getch();
		exit(1);
	}
	
	CloseHandle(plik);
	closedir(pdir);
	
	getch();
}
0

nie jest konieczne GENERIC_READ wystarczy GENERIC_WRITE albo FILE_WRITE_ATTRIBUTES tak samo FILE_SHARE_WRITE zbedne:

plik = CreateFile(nazwapliku, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

sprawdz czy plik nie jest przypadkiem ustawiony tylko do odczytu najleopij sprawdzajac czy w ogole CreateFile zwraca prawidlowy uchwyt bo jakos nie widze tego w Twoim prograie a byc powinno poza tym bledu nie widze

0

Posłuchałem twojej rady, teraz kod wygląda tak:

#include <dirent.h> 
#include <stdio.h> 
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

int main() {

	DIR *pdir;
	dirent *pent;
	char kat[30];
	
	HANDLE plik;
	
	printf("Podaj nazwe katalogu: ");
	scanf("%s", kat);
	pdir=opendir(kat);
	
	if (!pdir){
		printf ("Oooops");
		getch();
		exit(1);
	}
	
	// wyrzucam katalog "." i ".."
	pent=readdir(pdir);
	pent=readdir(pdir);
	
	
	pent=readdir(pdir);
	LPSTR nazwapliku = pent->d_name;
	printf("\n%s", nazwapliku);
	
	plik = CreateFile(nazwapliku, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
	
	DWORD error = GetLastError();
	
	if(error == (DWORD)INVALID_HANDLE_VALUE) {
		FILETIME ft;
		SYSTEMTIME st;

		GetSystemTime(&st);
		SystemTimeToFileTime(&st, &ft);
	
		if( SetFileTime(plik, &ft, &ft, &ft) )
			printf(" - zapisano\n");
		else
			printf(" - niezapisano\n");
	}
	
	else
		printf(" - nieprawidłowy uchwyt\n");
	CloseHandle(plik);
	closedir(pdir);
	
	getch();
}

Zwraca mi nieprawidłowy uchwyt do pliku... Sprawdziłem wszystkie atrubuty i jest ok - nie są "tylko do odczytu"... Nie rozumiem dlaczego to nie działa... :O

0
DzieX napisał(a)

Zwraca mi nieprawidłowy uchwyt do pliku... Sprawdziłem wszystkie atrubuty i jest ok - nie są "tylko do odczytu"... Nie rozumiem dlaczego to nie działa... :O

Chyba dlatego, że zmienna nazwapliku nie zawiera ścieżki do pliku tylko samą jego nazwę.

0

Dobra poddaję się, spróbuję jakoś to obejść...

P.S. kAzek - podałem pełną ścieżkę do pliku, ale nic to nie zmieniło :(

0

error = GetLastError();
if(error == (DWORD)INVALID_HANDLE_VALUE)

czlowieku jak ty sprawdzasz blad!

if (plik == INVALID_HANDLE_VALUE) printf("blad otwarcia (kod %d)", GetLastError());
else
printf("plik otwarty pomyslnie!");
</quote>
0
        //ciach
        pent=readdir(pdir);
        pent=readdir(pdir);
        pent=readdir(pdir);
        
        char nazwapliku [MAX_PATH];
        wsprintf(nazwapliku,"%s\\%s", kat, pent->d_name);
        printf("\n%s",nazwapliku);       
        plik = CreateFile(nazwapliku, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,0);
//ciach

To działa na 100% sprawdziłem :)
EDIT// Sieżkę podajesz oczywiście bez "" na końcu.

0

Dzięki, teraz już wszystko gra :)

Ale mam jeszcze jeden problem - jak wyszukać katalogi ? Czy jest jakaś gotowa funkcja do tego ?

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