Just nu i M3-nätverket
Gå till innehåll

Progressbar vid kopiering av fil


Mr Andersson

Rekommendera Poster

Kan man vid filkopiering läsa av/få ett event på hur många bytes som är kopierade? Eller måste jag banka ihop en egen kopieringsfunktion för det? I så fall, några enkla tips om hur man gör detta (det går bra med C#-kod).

 

 

 

Länk till kommentar
Dela på andra webbplatser

Tek-tips som är ett annat forum jag brukar söka hjälp från. Där hittade jag detta.

 

http://www.tek-tips.com/viewthread.cfm?qid=1498144

 

Jag är osäker på om man kan gå direkt till en tråd om man inte är registrerad. Den ligger i forumet Visual Basic(Microsoft) -VB.NET/VB2005 och är bara några dagar gammal så du ska nog kunna hitta den ändå.

 

Länk till kommentar
Dela på andra webbplatser

Det verkar onödigt tillkrånglat. Jag har gjort samma sak i Delphi (Object Pascal) för ett par år sedan, och jag kan inte tänka mig att det skulle vara svårare med .net.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Använd ett FileSystemWatcher-objekt och använd filtret NotifyFilter.Size för att trigga events när filstorleken ändras. Dock så brukar ju Windows reservera utrymme för hela filen vid en filkopiering, så detta sätt kommer nog inte ha önskad effekt.

 

Men låt då bli att använda en ren Copy-funktion och läs istället in källfilen med en BinaryReader, i den block-storlek du känner för, och spara sen ned den med en BinaryWriter. Här har du ju full kontroll över hur många bytes som lästs/skrivits. Svårare är det inte.

 

Länk till kommentar
Dela på andra webbplatser

Eftersom jag ändå sitter och väntar på att ett par filmnedladdningar så skrev jag ett exempel till dig. Du får ursäkta att jag skrev det i C#, men det går snabbare så för mig.Här läser den filen i 64K-block och tickar upp progr.bar för varje block.

 

Om du inte vill att denna process skall halta programmet får du använda dig av multithreading och använder du väldigt stora block kan du använda dig av asynkron filaccess, så tråden inte behöver stå och vänta på att blocket lästs in.

 

private void CopyFile(string Source, string Destination)
{
FileStream sourceStream=new FileStream(Source,FileMode.Open);
FileStream destStream = new FileStream(Destination, FileMode.Create);
BinaryReader br = new BinaryReader(sourceStream);
BinaryWriter bw = new BinaryWriter(destStream);
int blockSize = 65536;
byte[] buffer=new byte[blockSize];
long fileSize = sourceStream.Length;

progressBar1.Maximum = (int)(fileSize/blockSize);
progressBar1.Step = 1;

while (br.PeekChar() != -1)
{
	buffer=br.ReadBytes(blockSize);
	bw.Write(buffer);
	progressBar1.PerformStep();
}
br.Close();
bw.Close();
}

 

 

[inlägget ändrat 2008-09-13 01:38:44 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...