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); }
|
|