FOK!forum / Digital Corner / probleempje in C#
Muchachooozaterdag 20 november 2010 @ 16:40
Hoi allemaal!

Ik heb een klein probleem. Ik heb een klein programma geschreven dat mijn zusje loopt te naggen als ze haar downloads niet uit mijn documenten haalt. Dit doe ik door mijn documenten te vergelijken met een backup.
nu is mijn probleem dat dit programma ALTIJD aangeeft dat mijn backup verschilt van het origineel, zelfs als ik ze net gekopieerd heb.

weet iemand waar dit aan kan liggen of misschien een workaround in mijn code?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            
            string pathA = @"C:\Users\Sander\Videos\";
            string pathB = @"C:\Users\Sander\Vydeos\";

            System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(pathA);
            System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(pathB);

            
            IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
            IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

            bool areIdentical = list1.SequenceEqual(list2);

            while (areIdentical == false)
            {
                MessageBox.Show("Je hebt de downloads nog niet verplaatst!");
            }
            
            Application.Exit();
        }
    }
}
Prutzenbergzaterdag 20 november 2010 @ 16:57
Waarom zo moeilijk doen? Je kan toch ook gewoon haar standaard download-dir anders instellen?
Of haar een eigen account geven, kan ze er gewoon een zooitje van maken zonder dat je er last van hebt.
Muchachooozaterdag 20 november 2010 @ 17:00
quote:
1s.gif Op zaterdag 20 november 2010 16:57 schreef Prutzenberg het volgende:
Waarom zo moeilijk doen? Je kan toch ook gewoon haar standaard download-dir anders instellen?
Of haar een eigen account geven, kan ze er gewoon een zooitje van maken zonder dat je er last van hebt.
probleem is, ze heeft een eigen account, en haar standaard directory staat ingesteld, alleen heeft mijn client daar schijt aan en gooit nog steeds alles in mijn docs. bovendien heeft het te maken met haar iets leren, aangezien ik haar bijna elke dag vraag of ze die zooi uit mijn documenten haalt en ze het nooit doet. principekwestie dus :P
xprotagonistxzaterdag 20 november 2010 @ 17:01
Ik ben geen c#, maar ik vermoed dit:

fout: Je kijkt nu of via SequenceEqual of alle FileInfos gelijk zijn. Een FileInfo bevalt de bestandsnaam, maar ook inclusief het pad (dat verschillend is). Verder staat er ook de tijd waarop het bestand gemaakt is, etc. Dat zijn eigenschappen die verschillen, ook al zijn de bestanden qua inhoud hetzelfde.

oplossing: op een andere manier bepalen of bestanden hetzelfde zijn. Je zou kunnen kijken of de namen (excl. pad) hetzelfde zijn en de groottes ook.
Muchachooozaterdag 20 november 2010 @ 17:03
quote:
1s.gif Op zaterdag 20 november 2010 17:01 schreef xprotagonistx het volgende:
Ik ben geen c#, maar ik vermoed dit:

fout: Je kijkt nu of via SequenceEqual of alle FileInfos gelijk zijn. Een FileInfo bevalt de bestandsnaam, maar ook inclusief het pad (dat verschillend is). Verder staat er ook de tijd waarop het bestand gemaakt is, etc. Dat zijn eigenschappen die verschillen, ook al zijn de bestanden qua inhoud hetzelfde.

oplossing: op een andere manier bepalen of bestanden hetzelfde zijn. Je zou kunnen kijken of de namen (excl. pad) hetzelfde zijn en de groottes ook.
zou je bepaalde parameters mee kunnen geven aan die SequenceEqual? want ik zou zo niet weten hoe ik zorg dat twee lists krijg met alleen de filenames.

EDIT zou het werken als ik system.io.fileinfo verander naar system.io.fileinfo.name?
xprotagonistxzaterdag 20 november 2010 @ 17:07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bestandInBeideLijsten(IEnumerable ene lijst, IEnumerable ander lijst)
{
    foreach(FileInfo ene in de ene lijst)
    {
        foreach(FileInfo andere in de andere lijst)
        {
            if (ene.naam.equals(andere.naam) && ene.grootte.equals(andere.grootte))
            {
                return true;
            }
        }
    }
    return false;
}
TwenteFCzaterdag 20 november 2010 @ 17:08
Kan je niet gewoon naar de totale map grootte kijken?
Muchachooozaterdag 20 november 2010 @ 17:08
quote:
19s.gif Op zaterdag 20 november 2010 17:08 schreef TwenteFC het volgende:
Kan je niet gewoon naar de totale map grootte kijken?
hahah daar zeg je me wat.

EDIT nee, DirectoryInfo class heeft geen Length property helaas :'(
xprotagonistxzaterdag 20 november 2010 @ 17:14
Dude, niet alles wat je kan bedenken is door Bill voor jou gemaakt als kant en klaar blokje (`property') voor je probleem.

1
2
3
4
5
long totalegrootte=0;
foreach(bestandinfo bestand in directory)
{
   totalegrootte+=bestand.grootte;
}

Je zal ooit zelf wel een paar regels moeten typen.
TwenteFCzaterdag 20 november 2010 @ 17:15
http://dotnetperls.com/directory-size

1e google result.

Zo dus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
using System
;
using System.IO;

public class 
ShowDirSize 
{
    public static 
long DirSize(DirectoryInfo d
    {    
        
long Size 0;    
        
// Add file sizes.
        
FileInfo[] fis d.GetFiles();
        foreach (
FileInfo fi in fis
        {      
            
Size += fi.Length;    
        }
        
// Add subdirectory sizes.
        
DirectoryInfo[] dis d.GetDirectories();
        foreach (
DirectoryInfo di in dis
        {
            
Size += DirSize(di);   
        }
        return(
Size);  
    }
    public static 
void Main(string[] args
    {
        if (
args.Length != 1
        {
            
Console.WriteLine("You must provide a directory argument at the command line.");    
        } 
        else 
        {  
            
DirectoryInfo d = new DirectoryInfo(args[0]);
            
long dsize DirSize(d);
            
Console.WriteLine("The size of {0} and its subdirectories is {1} bytes."ddsize);
        }
    }
}
?>

bron: http://msdn.microsoft.com/en-us/library/system.io.directory.aspx
Muchachooozondag 21 november 2010 @ 02:09
heb het werkend nu, dank jullie!