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();
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
}
posto anche la classe Zip (ricordo che mi appogigo a SharpZipLib:
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
    }
}
Spero che qualcuno abbia la pazienza di leggere e di darmi una mano.
Saluti