Performance Probleme beim Kopieren auf Netzwerk-Freigabe



  • Hallo,

    ich bin gerade an einem Programm bei, mit dem ich Dateien auf ein Verzeichnis im Netzwerk kopiere.
    Dieses remote Verzeichnis ist per Passwort geschützt.
    Um nun die Dateien kopieren zu können, melde ich mich per LogonUser an, kopiere die Datei dorthin und melde mich per RevertoSelf wieder ab.
    Das klappt auch alles.

    Mein Problem ist nur die Performance.
    Wenn ich mit meinem Programm die Dateien kopiere, geht es ziemlich langsam.

    Wenn ich mich jedoch vorher über den Windows Explorer auf dem Remote Verzeichnis anmelde, dann geht es sehr viel schneller.

    Woran kann das liegen?
    Wisst ihr vielleicht eine Lösung dafür?

    mfg

    plugnpray



  • _WIE_ kopierst du denn? Ohne das zu wissen, kann man nur raten...



  • Ich kopiere ganz normal mit der CopyFileEx-Funktion.

    Und in der CopyProgressRoutine sind keine großartigen Berechnungen drin.

    mfg

    plugnpray



  • also ich hatte das auchmal gebraucht mit dem kopieren und hatte da rausgefunden, dass es am schnellsten ist, wenn man die datei ausliest und neu schreibt...
    in der art:

    bool CThread::CopySH(LPCTSTR pFromFolder, LPCTSTR pToFolder)
    {
    	//--- copy - routine ---
    	CString from = pFromFolder;
    	CString to   = pToFolder;
    
    	CString sRoot = to.Left( to.Find(_T("\\")) );
    	AddDirBackSlash(sRoot);
    
    	__int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;
    
    	GetDiskFreeSpaceEx (sRoot, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes,(PULARGE_INTEGER)&i64FreeBytes);
    
    	//check if more than 500 MB (512000 KB)(524288000 B) available on destination drive
    	if(i64FreeBytes <= 524288000)
    		SendMessage(m_params.hwndNotify, WM_APP_THREAD_DISK_FULL, NULL, NULL);
    
    	if(GetTerminate() == TRUE) { return 0; } //terminate thread if user cancels
    
    	CString toDir = ExtractDir(to);
    
    	if(! DirectoryExists(toDir))
    	{
    		int iPos = 0;
    		while(true)
    		{
    			if(GetTerminate() == TRUE) { return 0; } //terminate thread if user cancels
    
    			iPos = toDir.Find( _T("\\"), iPos + 1 );
    
    			if(iPos == -1)
    				break;
    
    			CString sTemp = toDir.Mid(0, iPos);
    			::CreateDirectory(sTemp,NULL);
    		}
    	}
    
    	CFile fromFile(from, CFile::modeRead | CFile::typeBinary  | CFile::shareDenyWrite);
    	CFile toFile(to, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
    
    	int iFileSize = fromFile.GetLength() / 1024;
    	SendMessage(m_params.hwndNotify, WM_APP_THREAD_SET_FILEBAR, NULL, iFileSize);
    
    	fromFile.SeekToBegin();
    	DWORD dwRead;
    
    	const int BUFSIZE = 1024;
    	BYTE buffer[BUFSIZE];
    
    	do
        {
    		if(GetTerminate() == TRUE) { return 0; } //terminate thread if user cancels
    
    		dwRead = fromFile.Read(buffer, BUFSIZE);
            toFile.Write(buffer, dwRead);
    
    		SendMessage(m_params.hwndNotify, WM_APP_THREAD_FILEPROGRESS, NULL, NULL);
    
        }
        while (dwRead > 0);
    
    	//Set file attributes for new file
    	SetFileAttributes(to, GetFileAttributes(from));
    
    	return true;
    }
    

    da is jetz auch gleich noch ne routine drin, die checkt ob auf der platte weniger als 500mb frei sind 😉
    Die SendMessage() kannst du erstmal weglassen, das war meine eigene Bimmelei mit Progress, Fileprogress usw... :p



  • Okay, danke erstmal für den Auszug.

    Aber mein Problem ist, dass wenn ich mich über den Windows Explorer an dem Remote Computer mit Nutzername und Passwort dort annmelde, dann geht das Kopieren viel schneller, als wenn ich das nicht mache.

    Da versuche ich gerade durchzusteigen, wieso das so ist 😃 .

    mfg

    plugnpray



  • wahrscheinlich wird für jede datei dann neu die berechtigung zum kopieren geprüft.. oder für jedes byte oder so 😉


Anmelden zum Antworten