Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » ofstream Ausgabe sprengt Speicher

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
24.04.2008, 13:32 Uhr
~killdar
Gast


Hallo, ich ein Programm geschrieben das mir die Ordnerstruktur eines Verzeichnisses ausliest. Die Pfade der Ordner und Unterordner speichere ich in einer Liste und lese dann alle Dateien in einem Ordner und schreibe die Dateien dann direkt in eine datei weg.

Das funktioniert soweit wunderbar. Wenn ich aber mal einen Ornder wie "Programme" mit seinen tausenden von Unterordnern auslese und dann diese Methode hier aufrufe nimmt sich das programm immer mehr speicher.

das geht dann sogar soweit, dass der ram nicht mehr reicht(ich habe 1GB Ram) und windows-anfangen muss dateien auszulagern. wie kann ich dieses extrem speicherfressende laufzeit verhalten abstellen?

hier mal der code der besagte methode


C++:
bool FileManager::readFiles_BufferedWriteToFile(std::list<std::wstring> directoryList, std::wstring filePath)
{
    //Prüfen ob es Ausgabedatei schon gibt
    std::ifstream openTest(filePath.c_str());
    if (openTest)
        return false;

    //Ausgabedatei eröffnen
    std::ofstream outfile(filePath.c_str(), std::ios::binary | std::ios::out);

    std::list<std::wstring>::iterator it;
    for (it = directoryList.begin(); it != directoryList.end(); it++)
    {
        WIN32_FIND_DATA fd;
        TCHAR szDir[MAX_PATH];
        HANDLE hFind;

        //Pfad mit Wildcard ergänzen
        StringCchCopy(szDir, MAX_PATH, it->c_str());
        StringCchCat(szDir, MAX_PATH, TEXT("\\*"));    
        
        //erste Datei lesen '.'
        hFind = FindFirstFile(szDir, &fd);

        if (hFind == INVALID_HANDLE_VALUE)
            return false;
        else
        {
            //zweite Datei lesen '..'
            FindNextFile(hFind, &fd);

            //Ab jetzt echte Dateien, solange lesen bis Verzeichnis durchgelesen wurde
            while (FindNextFile(hFind, &fd) != 0)
            {
                //Ordner und versteckte Dateien nicht ausgeben
                if (fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN))
                    continue;

                //li.push_back(std::wstring(fd.cFileName));
                FileInfo x(getFileNameWithoutFileType(std::wstring(fd.cFileName),true),
                           extractFileType(std::wstring(fd.cFileName),true),
                           removeSpecialCharacter(readTitelOfFileEx(std::wstring(it->c_str()), std::wstring(fd.cFileName))),
                           std::wstring(std::wstring(it->c_str())+= L"\\" + std::wstring(fd.cFileName)));


                          
                outfile<<x.convertWStringToString(x.getFilePath()).c_str()<<";"
                        <<x.convertWStringToString(x.getFileName()).c_str()<<";"
                        <<x.convertWStringToString(x.getTitelText()).c_str()<<";"
                        <<x.convertWStringToString(x.getDocTyp()).c_str()<<";\n"<<std::flush;

                x.~FileInfo();
            }

            //Handle schließen
            FindClose(hFind);

        }
    }

    return true;

}



C++:
FileInfo::FileInfo(std::wstring name, std::wstring typ, std::wstring titel, std::wstring path):
                                    m_fileName(name), m_docTyp(typ), m_titelText(titel), m_filePath(path)
{
}

std::string FileInfo::convertWStringToString(std::wstring in)
{
         char charArr[1024]={0};
         WideCharToMultiByte(CP_ACP,
                             NULL,
                             in.c_str(),
                             static_cast<int>(in.length()),
                             charArr,
                             static_cast<int>(in.length()),
                             NULL,
                             NULL);
         return std::string(charArr);
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.04.2008, 17:27 Uhr
~killdar
Gast


kann mir keiner helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.04.2008, 17:39 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Naja, paar so Dinge:

zieh Variablen aus den Schleifen die darin benutzt werden, Destruktoren niemals manuell aufrufen und sowas.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2008, 00:02 Uhr
~killdar
Gast


ok, hab ich berücksichtig, damit wirds aber nicht besser.

der ofstream scheint für jeden satz den ich wegschreibe neuen speicher zu belegen und er wird erst freigegeben wenn das programm beendet wird.

gibts noch andere möglichkeiten eine datei zu schreiben als mit ofstream?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.05.2008, 10:14 Uhr
~Auron der Streuner
Gast


Du kannst wenn du unter .NET und CLI Programmieren willst auch noch mit dem StreamWriter und Reader arbeiten um Dateien zu schreiben und zu lesen- ich weiß allerdings nicht ob das das Problem behebt.
Ich habe ein ähnliches Programm schon geschrieben und als .NET Klasse da, wenn du das als Bsp mal haben möchtest kann ichs dir schicken - schreib mir einfach ne Mail an:
f.wessel@5elements-thegame.de
Da aber mein Ansatz der gleiche ist (Speichern der Ordnerstruktur in einer Liste beim Durchlauf) müsst ich jetzt glatt mal gucken wie viel ram der bei großen Ordnern braucht...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.05.2008, 15:16 Uhr
xXx
Devil


Warum nicht direkt Multibyte?
 
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: