Jag försöker att räkna filerna (även i undermappar). Det verkar som om jag är fel ute igen. jag är inte helt säker men jag tror att det tyvärr är det enda sättet... Detta kan kanske ge några tankar: Eller så här (om du bara skall räkna filer och foldrar): Tack för förslag, men inte något av förslagen stämmer enl utforskaren. Detta bör fungera.. Hej och tack Arathon, nu blev den biten kanonbra. Vad sätter du progressbarens maxvärde till då? antalet filer eller antalet directories? Så som det är nu så räknar du ju bara upp ett för varje directory...Räkna filer
<code>
folderName = folderBrowserDialog1.SelectedPath;
DirectoryInfo nyInf = new DirectoryInfo(folderName);
countMappar(nyInf);
private void countMappar(DirectoryInfo dir)
{//räknar mapparna på webbplatsen
string mapp = dir.ToString();
string[] dirs = Directory.GetDirectories(mapp);
int count = dirs.Length;
for (int i=0; i<count; i++)
{
DirectoryInfo nyMapp = new DirectoryInfo(dirs[i]);
countfiler(nyMapp);
}
smoothProgressBar1.Maximum = totaltAntal;
this.Text = this.Text + " Antal filer: " + totaltAntal.ToString();
}
private void countfiler(DirectoryInfo dir)
{ //räknar filerna på webbplatsen
string[] files = Directory.GetFiles(dir.ToString());
foreach(string file in files)
{
MessageBox.Show(file.ToString());
return;
}
}
</code>
Jag la in en MessageBox för att kolla filerna, men det är tomt.
Vad gör jag för fel (nu igen)?
[REDIGERAT]
Jag fick det att fungera, men är det ett bra sätt??
<code>
private void countMappar(DirectoryInfo dir)
{//räknar mapparna på webbplatsen
string mapp = dir.ToString();
string[] dirs = Directory.GetDirectories(mapp);
int count = dirs.Length;
int i;
for (i=0; i<count; i++)
{
DirectoryInfo nyMapp = new DirectoryInfo(dirs[i]);
countfiler(nyMapp);
}
smoothProgressBar1.Maximum = totaltAntal;
this.Text = this.Text + " Antal kataloger: " + i +" Antal filer: " + totaltAntal.ToString();
}
private void countfiler(DirectoryInfo dir)
{ //räknar filerna på webbplatsen
string[] files = Directory.GetFiles(dir.ToString());
foreach(string file in files)
{
totaltAntal++;
}
return;
}
</code>
Jag är ändå misstänksam mot den här koden, gämfört med utforskaren, så får jag inte rätt antal kataloger eller filer.Sv: Räkna filer
Du skulle kunna skippa att skapa din Directoryinfo eftersom du ändå bara använder namnet. du borde kunna använda strängen direkt. Sen är ju frågan om du inte vill gå rekursivt neråt till alla undermappar...:
private void countMappar(string dir)
{//räknar mapparna på webbplatsen
string[] dirs = Directory.GetDirectories(dir);
int count = dirs.Length;
int i;
for (i=0; i<count; i++)
{
totaltAntal+=countfiler(dirs[i]);
countMappar(dirs[i]);//rekursivt neråt?
}
smoothProgressBar1.Maximum = totaltAntal;
this.Text =String.Format("{0} Antal kataloger: {1} Antal filer: {2}",this.Text,i,totaltAntal);
}
private int countfiler(string dir)
{ //räknar filerna på webbplatsen
return Directory.GetFiles(dir).Length;
}
obs koden är ej testad så det kan vara nåt fel...
Orsaken till att du inte får rätt count är att du inte går rekursivt neråt till alla undermappar...
Sv: Räkna filer
private void countMappar(DirectoryInfo dir)
{
string dirs = "";
foreach(DirectoryInfo di in dir.GetDirectories())
{
dirs += @"Directory: " + di.ToString() + "<br>";
foreach(FileInfo fi in di.GetFiles())
{
dirs += " " + fi.ToString() + "<br>";
}
}
this.Label1.Text = dirs;
}
Sv: Räkna filer
private void countMappar(DirectoryInfo dir)
{ //räknar mapparna på webbplatsen
int dircnt = 0;
int filecnt = 0;
foreach(DirectoryInfo di in dir.GetDirectories())
{
dircnt++;
foreach(FileInfo fi in di.GetFiles())
{
filecnt++;
}
}
this.Label1.Text = string.Format("Det finns totalt: {0} filer i {1} mappar på webbplatsen", filecnt, dircnt);
}
Sv: Räkna filer
Det är fel på både antal kataloger och antal filer.
När det gäller min kod, så stämmer antal filer, men inte antal kataloger.
Jo vissst rekusivt gäller...Sv: Räkna filer
int folders=0;
int files=0;
countMappar("C:\\test",ref folders,ref files);
MessageBox.Show(String.Format("Folders: {0} files: {1}",folders,files));
private void countMappar(string dir, ref int foldercounter, ref int filecounter)
{
string[] dirs = Directory.GetDirectories(dir);
int count = dirs.Length;
int i;
filecounter+=Directory.GetFiles(dir).Length;
for (i=0; i<count; i++)
{
countMappar(dirs[i],ref foldercounter,ref filecounter);
}
foldercounter+=count;
}
Sv: Räkna filer
Den stämmer exackt med utforskaren.
Jag har dock ett problem till, jag använder ju föregående class för att sätta min progressbars maxtal. Därefter så skall jag kopiera filer (det är egenteligen en backup på webbplatsen). Problemet är att jag inte kan få till det med progressbarens value, den visar för lite.
<code>
private void FileCopy(string srcdir, string destdir, bool recursive)
{
try
{
DirectoryInfo dir;
FileInfo[] files;
DirectoryInfo[] dirs;
string tmppath;
smoothProgressBar1.Refresh();
if (! Directory.Exists(destdir))
{
Directory.CreateDirectory(destdir);
}
dir = new DirectoryInfo(srcdir);
if (! dir.Exists)
{
throw new ArgumentException("source dir doesn't exist -> " + srcdir);
}
files = dir.GetFiles();
foreach(FileInfo file in files)
{//
tmppath=Path.Combine(destdir, file.Name);
info.Text = "Kopiera fil: " + tmppath.ToString();
info.Refresh();
file.CopyTo(tmppath, false);
}//cleanup
files = null;
if (! recursive)
{
return;
}//otherwise, get dirs
dirs = dir.GetDirectories();
foreach(DirectoryInfo subdir in dirs)
{
tmppath = Path.Combine(destdir, subdir.Name);
FileCopy(subdir.FullName, tmppath, recursive);
this.smoothProgressBar1.Value++;
smoothProgressBar1.Refresh();
} //cleanup
dirs = null;
dir = null;
}
catch
{
return;
}
Form1.ActiveForm.Refresh();
}
</code>
Gör jag fel här med eller?Sv: Räkna filer
Är det inte PerformStep man skall använda istället för att själv räkna upp Value alltså:
this.smoothProgressBar1.Value++; ersätts med this.smoothProgressBar1.PerformStep();