Gibt es ein Limit für CFileFind Multiselect?
-
Hi Zusammen ich hab ein CFileFind mit multiselect. Mittlerweile läuft es ganz gut, wenn ich nur wenige Dateien markiere (bis 12 alles IO) Aber wenn ich mehr markiere bricht er mir hier ab!
if(WavPath.DoModal() == IDCANCEL) return;
Ich drück definitiv nicht auf CANCEL!
Was auch komisch ist, der überschreibt mir für den Fall auch ALLE Variablen!
da steht überall Müll drin! Ihr könnt euch vorstellen was dann noch geht! Richtig! NIX!
Jetzt steht in der MSDN man soll bei Multiselect m_ofn.nMaxFile setzen mit min 256. Wenn cih das richtig sehe ist das die maximal gültige Länge für den Pfad, mach ich das mal auf 1024 bricht er gleich von vorn herein ab und überschreibt mir alles!
Kann mir einer helfen?
So sieht der Teil mit dem FileDialog aus, vielleicht mach ich ja auch was falsch!WavPath.m_ofn.lpstrTitle = "Zu berechnende Wavefiles:"; WavPath.m_ofn.nMaxFile = 256; //maximale länge des Pfades if(WavPath.DoModal() == IDCANCEL) return;
Danke für jegliche Art von Bemühung!
-
Polofreak schrieb:
Jetzt steht in der MSDN man soll bei Multiselect m_ofn.nMaxFile setzen mit min 256. Wenn cih das richtig sehe ist das die maximal gültige Länge für den Pfad, mach ich das mal auf 1024 bricht er gleich von vorn herein ab und überschreibt mir alles!
Der Puffer, auf den du lpstrFile setzt, muss natürlich auch so groß sein, wie du es in nMaxFile angibst.
-
und wenn ich da selber gar keinen puffer drauf setz?
Brauch ich das nMaxFile überhaupt zu setzen?Hier mal mein kompletter Code vielleicht siehst ja was.
void CWavealyzeView::OnButton1() { CString blubber = "test"; CString messages = ""; CStringArray DateiNamen; DateiNamen.RemoveAll(); CString temp = ""; CFileFind itsFile; CString Extensions = "ExportToExcel (*.xls)|*.xls|ExportToCsv (*.csv)|*.csv||"; CFileDialog ExportTO(FALSE,"xls","",OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXTENSIONDIFFERENT,Extensions,NULL); CFileDialog WavPath(TRUE,"wav","",OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_ALLOWMULTISELECT,"Wave (*.wav)|*.wav||",NULL); DWORD dwAnfang = 0; DWORD dwEnde = 0; long AnzahlFiles = 0; long passedTests = 0; CString XLSFile = ""; // SpeichernDialog in hier eingetragenes File kommen die Werte ExportTO.m_ofn.lpstrTitle = "Berechnungen Exportieren nach:"; if(ExportTO.DoModal() == IDCANCEL) return;//wenn Cancel gedrückt wird abbrechen XLSFile = ExportTO.GetPathName();//Zuweisung des Pfades an Lokale Variable ExportTO.DestroyWindow();//Fenster wieder ordentlich wegräumen CWaitCursor csr;//SandUhr als Mauszeiger //Wenn das File nicht bereits an der Stelle besteht! if(!itsFile.FindFile(XLSFile)) { WavPath.m_ofn.lpstrTitle = "Zu berechnende Wavefiles:"; WavPath.m_ofn.nMaxFile = 256; //maximale länge des Pfades if(WavPath.DoModal() == IDCANCEL) return; POSITION Pos = WavPath.GetStartPosition(); AnzahlFiles = 0; while(Pos!=NULL) { DateiNamen.Add(_T(WavPath.GetNextPathName(Pos))); AnzahlFiles++; } } else { AfxMessageBox("Überschreiben von bestehenden Dateien wird nicht unterstützt!",MB_ICONSTOP,0); itsFile.Close(); return; } if(AnzahlFiles>0) { for(int i = 0; i<AnzahlFiles; i++) { temp=DateiNamen.GetAt(i); if (itsFile.FindFile(temp)) { fstream FileBin(temp, ios::in|ios::out|ios::binary); if (FileBin.is_open()) { m_Wavefile = FileBin; if(!batchexport(temp,XLSFile)) { MessageBox("Fehler beim Exportieren!","FEHLER"); break; } } else MessageBox("File "+temp+"bereits geöffnet, kein Zugriff möglich.","FEHLER"); } else MessageBox("File not found","ERROR"); } dwEnde = GetTickCount(); messages.Format("Formatieren von %d Dateien dauerte %d ms",passedTests, dwEnde-dwAnfang); MessageBox(messages,"INFO"); csr.Restore(); } else AfxMessageBox("Angegebener Ordner enthält keine Wave-Dateien!",MB_ICONSTOP,0); }
-
Polofreak schrieb:
und wenn ich da selber gar keinen puffer drauf setz?
Dann benutzt CFileDialog seinen eigenen Puffer. Der ist _MAX_PATH Zeichen groß. Je nach Pfadlänge kann das schnell knapp werden.
Brauch ich das nMaxFile überhaupt zu setzen?
Du solltest es nicht tun. Entweder beide, oder keines.
-
_MAX_PATH ist doch eine Konstante der MFC oder nicht? Ich werde mich hüten und Konstanten der MFC umschreiben. Deshalb hab ich versucht:
m_ofn.nMaxFile = _MAX_PATH;
Aber auch das führt zu exact gleichem Problem! Ich glaube auch nicht wirklich daran dass es die Pfadlänge ist, die das Hauptproblem ist, weil es ja mit gleichem Pfad nur weniger dateien geht!
Der springt immer raus wenn ich auf IDCANCEL abfrag! Das kann doch nicht sein!
noch ne andere Idee woher das kommen kann?Alternativ: Weiß jemand wie ich beim FileDialog einen Ordner auswählen kann? dass nicht Files auswählbar sind sondern die Ordner? (dann kann ich in dem Ordner Filefind machen)
Vielen Dank!
-
Polofreak schrieb:
_MAX_PATH ist doch eine Konstante der MFC oder nicht? Ich werde mich hüten und Konstanten der MFC umschreiben.
Das hat auch niemand gesagt.
Deshalb hab ich versucht:
m_ofn.nMaxFile = _MAX_PATH;
Aber auch das führt zu exact gleichem Problem!
Logisch. Genau das macht CFileDialog ja auch selbst.
Ich glaube auch nicht wirklich daran dass es die Pfadlänge ist, die das Hauptproblem ist, weil es ja mit gleichem Pfad nur weniger dateien geht!
Alle Dateinamen werden mit Pfad in diesen Puffer geschrieben. Irgendwann ist der zu klein. Das hängt von der Anzahl der Dateien ab.
Du musst lpstrFile einen eigenen, größeren Puffer zuweisen und in nMaxFile dessen Größe angeben.
Alternativ: Weiß jemand wie ich beim FileDialog einen Ordner auswählen kann? dass nicht Files auswählbar sind sondern die Ordner?
Gar nicht. Zum Auswählen von Verzeichnissen benutzt man üblicherweise SHBrowseForFolder.
-
Das Problem ist man kann die Größe nicht im voraus wissen. Macht man den Buffer größer und der User wählt noch mehr Dateien aus klappts wieder nicht.
-
hm dann muss ich also doch wieder zu der unschönen variante von der ich komm zurück gehen und immer nen ganzen Ordner auswählen den er mir verarbeitet.
Problem ist, der Tester der die Wavefiles erzeugt mit denen ich arbeite schiebt mir Tag für Tag nahezu 2000 Files da rein, sprich der Ordner wird von Tag zu Tag richtig schön viel größer und wenn dann jemand mal schnell den Ordner auswählt kann er entweder das Prog abschießen oder mal ein paar Tage warten!Naja ich dank euch aber recht herzlich für eure Tips
-
Hallo,
bin hier mal drüber gestolpert.
Ich hatte auch dieses Problem gehabt.Hier ist meine Variante:
TCHAR* cFileNames; const DWORD dMax = 65535; cFileNames = new TCHAR[dMax]; memset( cFileNames, 0, sizeof( cFileNames ) ); CString str; int i = 0; m_strArray.RemoveAll(); // -> Ist ein CStringArray CFileDialog fDlg(TRUE, NULL,_T("*.*"), OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT, _T("Excel-Dateien (*.xls)|*.xls; | All files (*.*)|*.*|")); fDlg.m_pOFN->nMaxFile = dMax; fDlg.m_pOFN->lpstrFile = (LPSTR)cFileNames; // fDlg.m_pOFN->lpstrInitialDir = GetOpenFolder(); if( fDlg.DoModal() == IDOK ) { POSITION pos = fDlg.GetStartPosition(); CString sDatei; while( pos ) { sDatei = fDlg.GetNextPathName(pos); TRACE("Im ÖffnenDlg Datei = %s\n", sDatei); m_strArray.Add(sDatei); } } delete [] cFileNames;
Damit kam ich klar als über 1500 Dateien gelesen werden mussten.
-
Wow muss ich morgen gleich mal probieren danke
-
.. schrieb:
fDlg.m_pOFN->nMaxFile = dMax;
fDlg.m_pOFN->lpstrFile = (LPSTR)cFileNames;Polofreak schrieb:
Wow muss ich morgen gleich mal probieren danke
MFK schrieb:
Du musst lpstrFile einen eigenen, größeren Puffer zuweisen und in nMaxFile dessen Größe angeben.
-
Danke MFK hatte bisher noch nicht mal die Zeit den fertigen Source zu probieren, drum natürlich auch nicht selbst nen Code zu schreiben. Und da ich hier mit einigen Sachen überrumpelt wurde, bin ich leider nicht dazu gekommen. Aber vielleicht werde ich mal selbst versuchen ob ich das hin bekomm, und falls nicht, nehm ich den geposteten Source noch mal her.
Vielen Dank auf jeden Fall