实现功能(暂无实现文件上传到数据库,只实现界面上传效果):
上传文件名称展示,上传文件名称展示, 上传进度展示,上传速度展示,单个取消操作,全部取消操作;
界面展示

1,设置时间触发器
/// <summary>
/// 时间事件触发文件上传
/// </summary>
private void TimeEvents()
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 1000; //执行间隔时间,单位为毫秒;
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(UpdateFileEvent);
}
private void UpdateFileEvent(object sender, System.Timers.ElapsedEventArgs e)
{
if (this.datUpdateFile.Rows.Count == 0)
{
return;
}
GC.Collect();
for (int i = 0; i < this.datUpdateFile.Rows.Count; i++)
{
if (this.datUpdateFile.Rows[i].Cells[2].Value == null || this.datUpdateFile.Rows[i].Cells[2].Value.ToString() != "0%")
{
continue;
}
if (this.datUpdateFile.Rows[i].Cells[2].Value.ToString() == "0%")
{
if (uploadCompletedList.Count >= 3 || uploadCompletList.Contains(this.datUpdateFile.Rows[i].Cells[1].Value.ToString()))
{
return;
}
Console.WriteLine(uploadCompletedList.Count);
UpdateFile(i.ToString());
}
}
}
2,在DataGridView中展示需要显示的文件信息
/// <summary>
/// 选择文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "C:";
openFileDialog1.Filter = "所有文件 (*.*)|*.*";
openFileDialog1.Multiselect = true;
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (this.datUpdateFile.Rows.Count == 0)//上传全部取消后,fileNameList和uploadCompletList需要清空
{
fileNameList.Clear();
uploadCompletList.Clear();
}
foreach (var fileName in openFileDialog1.FileNames)
{
if (fileNameList.Count != 0 && fileNameList.Contains(fileName.Split('\').LastOrDefault()))
{
continue;
}
fileNameList.Add(fileName.Split('\').LastOrDefault());
additem(fileName, fileName.Split('\').LastOrDefault(), "0%", "上传准备中...", "取消");
}
}
}
/// <summary>
/// 显示DataGridView一行内容
/// </summary>
/// <param name="fullFileName">文件全路径</param>
/// <param name="fileName">文件名</param>
/// <param name="colSpeedProgress">进度</param>
/// <param name="colSpeed">速度</param>
/// <param name="colOperation">操作</param>
public void additem(string fullFileName, string fileName, string colSpeedProgress, string colSpeed, string colOperation)
{
DataGridViewRow dgvr = new DataGridViewRow();
foreach (DataGridViewColumn c in this.datUpdateFile.Columns)
{
dgvr.Cells.Add(c.CellTemplate.Clone() as DataGridViewCell);
}
dgvr.Cells[0].Value = fullFileName;
dgvr.Cells[1].Value = fileName;
dgvr.Cells[2].Value = colSpeedProgress;
dgvr.Cells[3].Value = colSpeed;
dgvr.Cells[4].Value = colOperation;
this.datUpdateFile.Rows.Add(dgvr);
}
3,上传文件逻辑
/// <summary>
/// 上传文件
/// </summary>
/// <param name="num"></param>
private void UpdateFile(object num)
{
if (this.datUpdateFile.RowCount == 0)
{
Thread.ResetAbort();
return;
}
//var basePath = System.AppDomain.CurrentDomain.BaseDirectory;
//var allFilePath = basePath + "\fileDic";
//if (!Directory.Exists(allFilePath))
//{
// Directory.CreateDirectory(allFilePath);
//}
//string buttonText = this.datUpdateFile.Rows[index].Cells[1].Value.ToString();//获取文件后缀
//string fileName = DateTime.Now.ToString("yyyyMMddHHmmss.") + buttonText.Split('.').LastOrDefault();//重置文件名称
//var filePath = allFilePath + "\" + fileName;
int index = int.Parse(num.ToString());
string allFilePathOld = this.datUpdateFile.Rows[index].Cells[0].Value.ToString();//获取文件后缀
uploadCompletedList.Add(this.datUpdateFile.Rows[index].Cells[1].Value.ToString());
try
{
// 要上传的文件
FileStream fs = new FileStream(allFilePathOld, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
long length = fs.Length;
//每次上传4k
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];
//已上传的字节数
long offset = 0;
int size = r.Read(buffer, 0, bufferLength);
DateTime startTimeEd = startTime;
while (size > 0)
{
offset += size;
DateTime startTimeNow = DateTime.Now;
TimeSpan span = DateTime.Now - startTimeEd;
double second = span.TotalSeconds;
try
{
if (second > 0.001)
{
this.datUpdateFile.Rows[index].Cells[3].Value = (size / 1024 / second).ToString("0.00") + "KB/秒";
}
this.datUpdateFile.Rows[index].Cells[2].Value = (offset * 100.0 / length).ToString("F2") + "%";
}
catch (Exception)
{
return;
}
Application.DoEvents();
startTimeEd = startTimeNow;
#region 判断是否超时或者弱网
if ((DateTime.Now - startTimeNow).TotalSeconds >= 60)
{
try
{
this.datUpdateFile.Rows[index].Cells[2].Value = "上传数据超时,请重试";
}
catch (Exception)
{
}
return;
}
if ((DateTime.Now - startTimeNow).TotalSeconds >= 30 && (DateTime.Now - startTimeNow).TotalSeconds <= 60)
{
MessageBox.Show("网速为弱网,请耐心等待!");
}
#endregion
size = r.Read(buffer, 0, bufferLength);
}
r.Close();
try
{
uploadCompletedList.Remove(this.datUpdateFile.Rows[index].Cells[1].Value.ToString());
uploadCompletList.Add(this.datUpdateFile.Rows[index].Cells[1].Value.ToString());
}
catch (Exception)
{
return;
}
}
catch (Exception ex)
{
MessageBox.Show("上传失败,请重新上传");
return;
}
}
4,取消操作
/// <summary>
/// 选中一行中button按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void datUpdateFile_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex == 4)
{
string buttonText = this.datUpdateFile.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
Console.WriteLine(buttonText);
string contextValue = this.datUpdateFile.Rows[e.RowIndex].Cells[2].Value.ToString();
if (!(contextValue == "0%" || contextValue == "100.00%"))
{
return;
}
fileNameList.Remove(this.datUpdateFile.Rows[e.RowIndex].Cells[1].Value.ToString());
this.datUpdateFile.Rows.RemoveAt(e.RowIndex);
}
}
PS:如有BUG请见谅;