Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » DeleteFile

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.03.2007, 14:15 Uhr
~kasdaf
Gast


olla

ich möchte gerne einen ordner durchlaufe und alle dateien darin löschen. es funktioniert auch, allerdings verschwinden die dateien erst wenn das programm beendet ist.

d.h. die anweisung deletefile() wird ausgeführt und wenn ich ins verzeichnis gucke ist die datei noch da, auch wenn ich sie nicht mehr bearbeiten kann.

schließt sich das programm, verschwindet dann auch die datei aus dem ordner.

wie kommt das? was muss ich tun, damit die dati direkt verschwindet nachdem der befehl asugeführt wurde und nicht erst nach beenden des programmes?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.03.2007, 15:04 Uhr
Blubber2063



Hast du vielleicht noch ein handle auf das File offen, solange irgendjemand auf die Datei zugreift kann sie noch nicht gelöscht werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.03.2007, 16:10 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja wenn "irgendjemand" darauf zugreift, liefert DeleteFile Fehler - Wenn DU darauf zugreifst, wartet es bis deine Handle geschlossen sind.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.04.2007, 00:48 Uhr
~kasdaf
Gast



Zitat von FloSoft:
naja wenn "irgendjemand" darauf zugreift, liefert DeleteFile Fehler - Wenn DU darauf zugreifst, wartet es bis deine Handle geschlossen sind.


hmmm.....kann ich das irgendwie erzwingen? denn so lässt er die datei immer bis zum programm ende stehen.

Mal die routine um die es geht.

C++:
    while(true)
    {
        HANDLE hFind = INVALID_HANDLE_VALUE;
        hFind = FindFirstFile(fileDirW.c_str(), &fileData);
        std::wcout<<L"FindFirstFile: "<<fileData.cFileName<<std::endl;

        if(hFind != INVALID_HANDLE_VALUE)
            if(FindNextFile(hFind, &fileData) == 0)
            {
                std::wcout<<L"FindNextFile: "<<fileData.cFileName<<std::endl;
                break;
            }

        if(FindNextFile(hFind, &fileData) != 0 )
        {
            std::wcout<<L"FindNextFile: "<<fileData.cFileName<<std::endl;
            CTCPClient    tcp_client(12345, AF_INET, SOCK_STREAM, ip);
    
            FileNameInMultiByte[100];
            lenOfFileName = static_cast<int>(wcslen(fileData.cFileName));
            
            WideCharToMultiByte(CP_ACP,
                                WC_NO_BEST_FIT_CHARS,
                                fileData.cFileName,
                                static_cast<int>(wcslen(fileData.cFileName)),
                                FileNameInMultiByte,
                                100,
                                "_",
                                NULL);

            fileNameMBString = FileNameInMultiByte;

            /*Pfad + Dateiname der zu sendenen Datei zusammen setzen in Multi-Byte
            Ursprungspfad -1 (*) + den Dateinamen */

            fileToSend = fileDir.substr(0, fileDir.length()-1) +
                                        fileNameMBString.substr(0,lenOfFileName);

            tcp_client.SendData(tcp_client.GetConnectedSocket(), const_cast<char*>(fileToSend.c_str()), 0);

            /* Pfad der Datei in Widechar zusammenbauen und aus Ursprungsverzeichnis löschen */
            fileNameToDelete = fileData.cFileName;
            filepathToDelete = fileDirW.substr(0, fileDir.length()-1) +
                                        fileNameToDelete.substr(0,lenOfFileName);

            DeleteFile(filepathToDelete.c_str());

        }
        FindClose(hFind);
        Sleep(1000);
    }
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.04.2007, 18:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


würde mal tippen das das FindFile das blockiert
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.04.2007, 20:02 Uhr
~kasdaf
Gast



Zitat von FloSoft:
würde mal tippen das das FindFile das blockiert


hm, wie das? den handle close ich ja, von daher kann FindFile da eigentlich nicht mehr draufhängen?!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.04.2007, 21:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
verschickt "SendData" die Datei? evtl schließt die das filehandle nicht korrekt?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.04.2007, 21:56 Uhr
~kasdaf
Gast


Ja, die Methode öffnet die Datei als streamdatei und schickt sie dann über die send methode der sockets weg. allerdings mache ich defentiv am ende ein .close() auf die datei, womit alles wieder frei sein sollte.

Hier mal dei komplette Methode:

C++:
int CCreateSocket::SendData(SOCKET sendSocket, char* buf, int flags)
{
    char sendBuffer[SND_RCV_BUFFER_SIZE];
    unsigned long    totalSend = 0;
    unsigned long    sizeOfFile = 0;
    unsigned long    restToBeSend = 0;
    std::string        fileName; /* Dateiendung */

    /* Übliche Blöckgröße der zu sendenen Daten */
    const unsigned long usualSizeToSend = SND_RCV_BUFFER_SIZE;

    /* Größe der zu sendenen Datei ermitteln */
    HANDLE    hFile;
    DWORD    dwFileSize;
    wchar_t    buf_wide[SND_RCV_BUFFER_SIZE];

    /* Größe des Dateinamen */
    unsigned int sizeOfFileName = 0;



    //Dateipfad in Unicode umsetzen und mit CreateFile Dateigröße ermitteln */
    MultiByteToWideChar(CP_ACP, 0, buf, static_cast<int>(strlen(buf)+1),
                        buf_wide, sizeof(buf_wide)/sizeof(buf_wide[0]));
    
    hFile = CreateFile(buf_wide, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
                        FILE_ATTRIBUTE_READONLY, NULL);

    dwFileSize = GetFileSize(hFile, NULL);

    /* Von DWORD nach ULONG schieben */
    sizeOfFile = static_cast<unsigned long>(dwFileSize);

    std::ifstream myFile(buf, std::ios::binary | std::ios::in);

    if(myFile.is_open())
    {
        
        /* Größe der Datei die gesendet werden soll vorraus schicken */
        char * size = (char*) &sizeOfFile;
        send(sendSocket, size, sizeof(unsigned long), 0);

        /* Dateiendung/Größe der Dateiendung - der Datei die gesendet wird vorraus schicken */
        fileName = GetFileNameToSend(buf);
        sizeOfFileName = static_cast<unsigned int>(fileName.length());
        size = (char*) &sizeOfFileName;
        send(sendSocket, size, sizeof(unsigned int), 0);
        send(sendSocket, fileName.c_str(), static_cast<unsigned int>(fileName.length()), 0); /* Dateiname */

        /* Prüfen wegen Länge und EOF */
        while(myFile.good())
        {
            /*Exakte Anzahl an Bytes senden und nicht volle Buffergröße */
            if(restToBeSend > SND_RCV_BUFFER_SIZE)
            {
                myFile.read(sendBuffer, usualSizeToSend);
                totalSend += send(sendSocket, sendBuffer, SND_RCV_BUFFER_SIZE, 0);
            }
            else if(restToBeSend > 0)
            {
                myFile.read(sendBuffer, restToBeSend);
                totalSend += send(sendSocket, sendBuffer, restToBeSend, 0);
            }
            else if(restToBeSend == 0)
            {
                /* Ggf. EOF feststellen */
                myFile.read(sendBuffer, 1);
                if(myFile.eof())
                    break;
                totalSend += send(sendSocket, sendBuffer, 1, 0);
            }

            restToBeSend = sizeOfFile - totalSend;
        }
    }
        
    myFile.close();

    return totalSend;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.04.2007, 22:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi:


C++:
    // ...

    hFile = CreateFile(buf_wide, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
                        FILE_ATTRIBUTE_READONLY, NULL);

    // ...


    // oops? ;)

    return totalSend;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.04.2007, 22:06 Uhr
~kasdaf
Gast



Zitat von FloSoft:
hi:


C++:
    // ...

    hFile = CreateFile(buf_wide, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_EXISTING,
                        FILE_ATTRIBUTE_READONLY, NULL);

    // ...


    // oops? ;)

    return totalSend;
}






danke

blöde handles


oder wie war das....."das problem sitzt steht vor dem computer" ?!? ;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: