Ejemplo n.º 1
0
        private void CalculateMd5ForAllFiles(Action <string> UpdateAction)
        {
            int nbResults = 0;
            int i         = 0;

            using (SqlCeCommand cmd = new SqlCeCommand($@"SELECT COUNT(Id) FROM Files WHERE checksum = '' OR checksum IS NULL", m_connection))
            {
                SqlCeDataReader reader = cmd.ExecuteReader();
                reader.Read();
                nbResults = reader.GetFieldValue <int>(0);
            }
            SqlCeTransaction transaction = m_connection.BeginTransaction();

            using (SqlCeCommand cmd = new SqlCeCommand($@"SELECT Id, name, path, size, checksum FROM Files WHERE checksum = '' OR checksum IS NULL", m_connection))
            {
                SqlCeDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    if (m_bStop)
                    {
                        return;
                    }
                    i++;
                    int    Id = Convert.ToInt32(reader["Id"]);
                    long   s  = Convert.ToInt64(reader["size"]);
                    string p  = Convert.ToString(reader["path"]);
                    string n  = Convert.ToString(reader["name"]);
                    p = Path.Combine(p, n);
                    UpdateAction.Invoke($"Calculate CRC {i}/{nbResults} for {p} ({FileExplorer.GetFormattedSize(s)})");
                    string       fileChecksum = CalculateMD5(p, s);
                    SqlCeCommand cmdUpdate    = new SqlCeCommand($@"UPDATE Files SET checksum = @checksum WHERE Id = @Id", m_connection);
                    cmdUpdate.Parameters.Add("@Id", System.Data.SqlDbType.Int).Value            = Id;
                    cmdUpdate.Parameters.Add("@checksum", System.Data.SqlDbType.NVarChar).Value = fileChecksum;
                    cmdUpdate.ExecuteNonQuery();
                }
                transaction.Commit();
            }
        }