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, botów: 0