Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Split folder
Forum - C# / VB.NET - Split folder

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 2:06
Martedì, 25/07/2017
Ciao ho un problema, vorrei fare un applicazione che mi suddividesse una cartella in più cartelle in una dimensione scelta da me.

Il codice che sto provando è questo:
Codice sorgente - presumibilmente C#

  1. string[] filesSorgente = null;
  2.         long dimensioneTotaleSorgente = 0;
  3.         string newDir = "";
  4.         long dimensioneTotaleDir;
  5.         byte nomeSequenzaCartella = 0;
  6.         List<string> list = null;
  7.  
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.         }
  12.  
  13.         /// <summary>
  14.         /// Dimensione della cartella sorgente
  15.         /// </summary>
  16.         /// <param name="path"></param>
  17.         private void DimensioneCartella(string path)
  18.         {
  19.             filesSorgente = Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories);
  20.             foreach (string file in filesSorgente)
  21.             {
  22.                 FileInfo fi = new FileInfo(file);
  23.                 dimensioneTotaleSorgente += fi.Length;
  24.             }
  25.         }
  26.  
  27.         /// <summary>
  28.         /// Dimensione della nuova cartella creata
  29.         /// </summary>
  30.         /// <param name="path"></param>
  31.         private void DirNewFolder(string path)
  32.         {
  33.             foreach (string file in Directory.GetFiles(path, "*.*", System.IO.SearchOption.AllDirectories))
  34.             {
  35.                 FileInfo fi = new FileInfo(file);
  36.                 dimensioneTotaleDir += fi.Length;
  37.             }
  38.         }
  39.  
  40.         private void ControlloCartellaDestinazione(string path)
  41.         {
  42.             list = new List<string>();
  43.             foreach (string str in Directory.GetDirectories(path))
  44.             {
  45.                 if (str.StartsWith(path + @"\Prova_"))
  46.                     list.Add(str);
  47.             }
  48.         }
  49.  
  50.         private void btnSorgente_Click(object sender, EventArgs e)
  51.         {
  52.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  53.             if (fbd.ShowDialog() == DialogResult.OK)
  54.                 txtSorgente.Text = fbd.SelectedPath;
  55.         }
  56.  
  57.         private void btnDestinazione_Click(object sender, EventArgs e)
  58.         {
  59.             FolderBrowserDialog fbd = new FolderBrowserDialog();
  60.             if (fbd.ShowDialog() == DialogResult.OK)
  61.                 txtDestinazione.Text = fbd.SelectedPath;
  62.         }
  63.  
  64.         private async void btnSplitta_Click(object sender, EventArgs e)
  65.         {
  66.             //Preleviamo la dimensione totale della directory sorgente
  67.             DimensioneCartella(txtSorgente.Text);
  68.  
  69.             if (dimensioneTotaleSorgente <= 0) //Controllo la directory sorgente se è vuota
  70.             {
  71.                 MessageBox.Show("La directory sorgente selezionata è vuota.", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  72.                 return;
  73.             }
  74.             else
  75.             {
  76.                 nomeSequenzaCartella = 1; //Numero aggiunto al nome della directory destinazione che verrà incrementato di uno se supera la dimensione scelta
  77.                 newDir = txtDestinazione.Text + @"\Prova_";
  78.                 if (!Directory.Exists(newDir + nomeSequenzaCartella))
  79.                     Directory.CreateDirectory(newDir + nomeSequenzaCartella);
  80.  
  81.                 foreach (string file in filesSorgente)
  82.                 {
  83.                     FileInfo fi = new FileInfo(file);
  84.  
  85.                     ControlloCartellaDestinazione(txtDestinazione.Text);
  86.  
  87.                     DriveInfo driveDest = new DriveInfo(txtDestinazione.Text);
  88.                     if (driveDest.AvailableFreeSpace > dimensioneTotaleSorgente) //Controllo se lo spazio su disco è maggiore della directory passata
  89.                     {
  90.                         using (FileStream SourceReader = File.Open(file, FileMode.Open))
  91.                         {
  92.                             string path = Path.GetDirectoryName(fi.FullName);
  93.  
  94.                             int i = 1;
  95.                             while (i <= list.Count)
  96.                             {
  97.                                 dimensioneTotaleDir = 0;
  98.                                 DirNewFolder(newDir + i);
  99.                                 if ((dimensioneTotaleDir + fi.Length) <= 1400000000) //Controllo se lo spazio della cartella + la dimensione del file sono minori di 4.3gb
  100.                                 {
  101.                                     if (!Directory.Exists(txtDestinazione.Text + @"\Prova_" + i + path.Substring(txtSorgente.Text.Length) + "\\"))
  102.                                         Directory.CreateDirectory(txtDestinazione.Text + @"\Prova_" + i + path.Substring(txtSorgente.Text.Length) + "\\");
  103.  
  104.                                     using (FileStream DestinationWriter = File.Create(txtDestinazione.Text + @"\Prova_" + i + path.Substring(txtSorgente.Text.Length) + "\\" + fi.Name))
  105.                                     {
  106.                                         await SourceReader.CopyToWithProgressAsync(DestinationWriter, 4096);
  107.                                         break;
  108.                                     }
  109.                                 }
  110.  
  111.                                 if ((dimensioneTotaleDir + fi.Length) > 1400000000)
  112.                                 {
  113.                                     i++;
  114.                                     if (!Directory.Exists(txtDestinazione.Text + @"\Prova_" + i + path.Substring(txtSorgente.Text.Length) + "\\"))
  115.                                         Directory.CreateDirectory(txtDestinazione.Text + @"\Prova_" + i + path.Substring(txtSorgente.Text.Length) + "\\");
  116.  
  117.                                     using (FileStream DestinationWriter = File.Create(txtDestinazione.Text + @"\Prova_" + i + fi.DirectoryName.Substring(txtSorgente.Text.Length) + "\\" + fi.Name))
  118.                                     {
  119.                                         await SourceReader.CopyToWithProgressAsync(DestinationWriter, 4096);
  120.                                         break;
  121.                                     }
  122.                                 }
  123.                             }
  124.  
  125.                             //dimensioneTotaleDir = 0;
  126.                         }
  127.                     }
  128.                     else
  129.                     {
  130.                         MessageBox.Show("Spazio richiesto insufficiente!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  131.                         return;
  132.                     }
  133.                 }
  134.  
  135.                 MessageBox.Show("Copia effettuata con successo.", "Avviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
  136.             }
  137.         }



Passata la directory sorgente e la directory destinazione, la funzione del programma è fare una copia dei file presenti all'interno della cartella sorgente in quella destinazione, creando al suo interno una cartella Prova_1 che non deve superare la dimensione scelta da me altrimenti dovrebbe creare un'altra cartella e cosi via per tutti i file.
Nel mio esempio mi deve creare tre cartelle:
Prova_1
Prova_2
Prova_3

Il problema è se lascio il break nel secondo if, mi ritrovo solamente due cartelle in quale nella seconda i due file di dimensione superiore di 1.4 gb.
Al contrario se commento il break nel secondo if, mi crea tutte e tre le cartelle ma mi ritrovo lo stesso file anche nella seconda cartella nella quale non dovrebbe esserci.

Se non sono stato chiaro chiedete pure.

Ultima modifica effettuata da lupetto77 il 25/07/2017 alle 2:24
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:52
Martedì, 25/07/2017
La questione non è così semplice come pensi, anzi, è abbastanza complessa.

Cosa succede se nella cartella ci sono 2 file da 3 G ciascuno e chiedi di splittare in cartelle da massimo 500 M ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:54
Martedì, 25/07/2017
Un idea sarebbe dividere il file in byte
Sbaglio nessuno?



https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:25
Martedì, 25/07/2017
Tutto si può fare ma è questo ciò che si vuole?

Le specifiche del problema devono essere precise.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 18:07
Martedì, 25/07/2017
Ciao e grazie per le risposte.

Cerco di dare più dettagli possibili:

Premetto che i file e le cartelle devono corrispondere con le originali.

Per non complicarmi troppo la vita avevo deciso se un file è superiore 1.4 gb, di copiarlo in una nuova cartella a prescindere dalla dimensione data, invece per gli altri file di dimensioni più piccoli di copiarli in un'altra cartella basta che sia <= dimensione data, altrimenti si va ha creare una nuova cartella lo stesso se capitasse un'altro file di dimensione superiore.

Ultima modifica effettuata da lupetto77 il 25/07/2017 alle 18:11
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:15
Martedì, 25/07/2017
A parte gli errori di ortografia, non si è capito nulla.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 19:24
Martedì, 25/07/2017

si dovebbe calcolare:

Dim.dati_nella_cartella + Dim.Nuovi_dati <= 1,4 GB (o limite che vuoi)
sposta i dati nella cartella corrente

altrimenti crea nuova cartella e sposta lì i dati.

Ma un esempio: hai 4 file
1,2GB  ----  300MB ----- 2GB ----- 150MB

Come dovrebbe essere il risultato?

cartella1 = 1.2GB + 150MB = 1,35 GB
cartella2 = 300MB
cartella3 = 2GB

OPPURE


cartella1 = 1.2GB
cartella2 = 300MB + 150GB = 450MB
cartella3 = 2GB

OPPURE 4 cartelle?

Dare priorità alla cartella creata per prima o quella più vuota?

PM Quote
Avatar
lupetto77 (Normal User)
Pro


Messaggi: 75
Iscritto: 04/12/2011

Segnala al moderatore
Postato alle 23:46
Martedì, 25/07/2017
Ciao e grazie a tutti

Ciao Mikelius prendendo il tuo esempio:
Codice sorgente - presumibilmente C# / VB.NET

  1. si dovebbe calcolare:
  2.  
  3. Dim.dati_nella_cartella + Dim.Nuovi_dati <= 1,4 GB (o limite che vuoi)
  4. sposta i dati nella cartella corrente
  5.  
  6. altrimenti crea nuova cartella e sposta lì i dati.
  7.  
  8. Ma un esempio: hai 4 file
  9. 1,2GB  ----  300MB ----- 2GB ----- 150MB
  10.  
  11. Come dovrebbe essere il risultato?



Il risultato va bene cosi:
cartella1 = 1.2GB + 150MB = 1,35 GB
cartella2 = 300MB
cartella3 = 2GB

Partendo dal tuo esempio qui sopra:
La priorità è che ad ogni file partendo dalla cartella1 bisogna controllare se c'è spazio allora copia il file altrimenti si va alla cartella2, si fa di nuovo il controllo stessa cosa, controllare se c'è lo spazio allora si copia il file altrimenti si va alla cartella3 stessa cosa delle altre, ma se lo spazio non è sufficente in tutte e 3 le cartelle deve creare la cartella4 e cosi via fino la fine.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 23:51
Martedì, 25/07/2017
Ma tutto questo ha uno scopo o è solo perché non sei ancora riuscito a copiare file di grandi dimensioni?

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo