Salve a tutti.
Sto creando un programma che legge una lista di file .txt in una cartella e crea un file .mdb (access) per ogni file inserendo come record i dati presenti nel file txt.
Fin qui nessun problema, se non che oltre a creare i file .mdb spesso mi crea anche dei file .Idb (Informazioni di blocco record).
Una volta creati questi file ho l'esigenza di zipparli (uno a uno, o meglio ancora tutti insieme).
Il problema si verifica durante la fase di compressione, in quanto a volte mi viene detto che il file è in uso e viene generato un errore.
Premetto che per zippare uso la SharpZipLib.
Posto un po' di codice:
codice:... private Thread processo; ... processo = new Thread(AvviaProcesso); processo.Start();posto anche la classe Zip (ricordo che mi appogigo a SharpZipLib:codice:protected void AvviaProcesso() { DirectoryInfo dir = new DirectoryInfo(localFolder); //la cartella contenente i miei .txt FileInfo[] rgFiles = dir.GetFiles("*.txt"); if (rgFiles.Length > 0) { if (!Directory.Exists(Application.StartupPath + "\\temp")) { try { Directory.CreateDirectory(Application.StartupPath + "\\temp"); //cartella in cui salvare i file .mdb } catch (Exception ex) { MessageBox.Show(ex.Message); } } String db; String line; OleDbConnection conn; OleDbCommand cmd; ADOX.CatalogClass cat; String name; System.IO.StreamReader stream; foreach (FileInfo fi in rgFiles) { name = fi.Name.Replace(".txt", ""); //solo il nome del file senza percorso ed estensione db = Application.StartupPath + "\\temp\\" + name + ".mdb"; try { cat = new ADOX.CatalogClass(); try { cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + db + ";" + "Jet OLEDB:Engine Type=5"); } catch (Exception ex) { return; } string connString = @"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=" + db; conn = new OleDbConnection(connString); conn.Open(); string query = "CREATE TABLE prova (id AUTOINCREMENT, campo TEXT(30))"; cmd = new OleDbCommand(query, conn); cmd.ExecuteNonQuery(); stream = new System.IO.StreamReader(fi.FullName); while ((line = stream.ReadLine()) != null) { query = "INSERT INTO prova (campo) VALUES (\"" + line + "\")"; cmd = new OleDbCommand(query, conn); cmd.ExecuteNonQuery(); } stream.Close(); stream.Dispose(); } catch (System.Data.OleDb.OleDbException ex) { timer.Enabled = false; MessageBox.Show(ex.Message); lblStatus.Text = "Stato: Errore - Stoppato"; return; } conn.Close(); conn.Dispose(); if (!Directory.Exists(Application.StartupPath + "\\zip")) { try { Directory.CreateDirectory(Application.StartupPath + "\\zip"); //cartella in cui salvare i file zippati } catch (Exception ex) { MessageBox.Show(ex.Message); } } Zip.ZipFile(Application.StartupPath + "\\zip\\" + name + ".zip", db); //singolo gile fi.Delete(); //elimino il .txt File.Delete(db); //elimino .mdb } } //Zip.ZipFolder(Application.StartupPath+"\\cartella.zip", Application.StartupPath + "\\temp"); //tutta la cartella }
Spero che qualcuno abbia la pazienza di leggere e di darmi una mano.codice:using System; using System.IO; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Checksums; namespace FtpTransferDB_V2 { /// <summary> /// Zip /// </summary> public class Zip { #region public methods /// <summary> /// Comprime il contenuto di un file in formato ZIP /// </summary> /// <param name="ZipFilePath">Path del file compresso da creare</param> /// <param name="OriginalFilePath">Path del file da comprimere</param> public static void ZipFile(string ZipFilePath, string OriginalFilePath) { try { FileInfo fi = new FileInfo(OriginalFilePath); ZipOutputStream zip = new ZipOutputStream(File.Create(ZipFilePath)); zip.SetLevel(6); // 0 - store only to 9 - means best compression AddFile2Zip(zip, fi, ""); zip.Finish(); zip.Close(); } catch (Exception ex) { throw ex; //VIENE GENERATA QUI } } /// <summary> /// Comprime il contenuto di una cartella in formato ZIP, ricorsivamente e preservandone la struttura /// </summary> /// <param name="ZipFilePath">Path del file compresso da creare</param> /// <param name="OriginalFolderPath">Path della cartella da comprimere</param> public static void ZipFolder(string ZipFilePath, string OriginalFolderPath) { try { DirectoryInfo di = new DirectoryInfo(OriginalFolderPath); ZipOutputStream zip = new ZipOutputStream(File.Create(ZipFilePath)); zip.SetLevel(6); // 0 - store only to 9 - means best compression AddFolder2Zip(zip, di, ""); zip.Finish(); zip.Close(); } catch (Exception ex) { throw ex; //VIENE GENERATA QUI } } #endregion #region private methods private static void AddFolder2Zip(ZipOutputStream zip, DirectoryInfo di, string internalzippath) { string izp = internalzippath + di.Name + "/"; // A directory is determined by an entry name with a trailing slash "/" Crc32 crc = new Crc32(); ZipEntry entry = new ZipEntry(izp); entry.Crc = crc.Value; zip.PutNextEntry(entry); foreach (FileInfo fi in di.GetFiles()) AddFile2Zip(zip, fi, izp); foreach (DirectoryInfo sdi in di.GetDirectories()) AddFolder2Zip(zip, sdi, izp); } private static void AddFile2Zip(ZipOutputStream zip, FileInfo fi, string internalzippath) { Crc32 crc = new Crc32(); FileStream fs = File.OpenRead(fi.FullName); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(internalzippath + fi.Name); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; zip.PutNextEntry(entry); zip.Write(buffer, 0, buffer.Length); } #endregion } }
Saluti![]()

Rispondi quotando
