using System;
using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Dare.DN.Services.EntityServices;using Dare.DN.Components.Entities.Media;using System.IO;using System.Threading;using Dare.Utilities.Model;using System.Xml;using Dare.Utilities.Microsoft;using Dare.Utilities.IO;namespace DareMediaTray
{ public partial class MediaImportFrm : Form { bool isNormal = false; MediaInfoService mediaService = Dare.DN.Services.Application.Instance.GetDbService<MediaInfoService>(); MediaFileInfoService mediaFileService = Dare.DN.Services.Application.Instance.GetDbService<MediaFileInfoService>(); MediaFolderInfoService folderService = Dare.DN.Services.Application.Instance.GetDbService<MediaFolderInfoService>(); MediaUC mediaUC; Thread[] iThreads = null; AutoResetEvent[] iAutoReset = null; int folderId = 0; string[] mFiles = null; BackgroundWorker importBgWorker = null; BackgroundWorker bkWork = null; //int iCompleted = 0; int mCount = 0; string mPath = string.Empty; //private bool isAbort = false;//是否终止导入任务 public MediaImportFrm(int fdId, string[] mdFiles, MediaUC mdUC) { InitializeComponent(); mediaUC = mdUC; folderId=fdId; mFiles = mdFiles; mCount = mFiles.Length;MediaFolderInfo mediaFolderInfo = folderService.Get(folderId);
if (mediaFolderInfo == null) return;mPath = mediaFolderInfo.PhysicalPath;
this.Text =parentForm1.TitleText= string.Format("{0}媒体导入",mPath); this.parentForm1.onCloseEvent += new EventHandler(parentForm1_onCloseEvent); this.parentForm1.onMaxEvent += new EventHandler(parentForm1_onMaxEvent); this.parentForm1.onMinEvent += new EventHandler(parentForm1_onMinEvent); this.parentForm1.onMouseMoveEvent += new EventHandler(Form1_MouseDown); this.parentForm1.MaxmizeIcon(this.WindowState == FormWindowState.Maximized); this.btnSubmit.Click += delegate(object sender, EventArgs e) { RestBackWork(); this.Close(); };importBgWorker = new BackgroundWorker();
importBgWorker.DoWork += new DoWorkEventHandler(importBgWorker_DoWork); if (!importBgWorker.IsBusy) { importBgWorker.RunWorkerAsync(); } } private void importBgWorker_DoWork(object sender, DoWorkEventArgs e) { StartMedia(importBgWorker, e); } private void StartMedia(BackgroundWorker worker, DoWorkEventArgs e) { int i = 0; iThreads = new Thread[mCount]; iAutoReset = new AutoResetEvent[mCount];Program.ThreadSafe(this, delegate
{ this.lvImport.Items.Clear(); this.lvImport.View = View.Details; this.lvImport.GridLines = true; this.lvImport.FullRowSelect = true; this.lvImport.ShowItemToolTips = true; this.btnImport.Enabled = false; this.btnSubmit.Enabled = false; this.lvImport.SmallImageList = imageList1; });foreach (string file in mFiles)
{ FileInfo fn = new FileInfo(file); Program.ThreadSafe(this, delegate { ListViewItem li = new ListViewItem(); li.SubItems[0].Text = fn.Name; li.SubItems.Add(fn.DirectoryName); li.SubItems.Add(new FileSizeData(fn.Length).ToString()); li.SubItems.Add("0%"); li.SubItems.Add("准备导入!"); li.ImageIndex = 1; lvImport.Items.Add(li); });object[] objs = new object[4];
objs[0] = file; objs[1] = mPath; objs[2] = folderId; objs[3] = i;iAutoReset[i] = new AutoResetEvent(false);
iThreads[i] = new Thread(new ParameterizedThreadStart(MediaImport)); if (fn.Length < 10*1024 * 1024) iThreads[i].Priority = ThreadPriority.Highest; iThreads[i].IsBackground = true; iThreads[i].Start(objs); i++; } WaitAll(iAutoReset);//阻塞信号 //WaitHandle.WaitAll(IAutoReset); foreach (Thread thread in iThreads) { thread.Abort(); } iThreads = null; Program.ThreadSafe(this, delegate { this.btnImport.Enabled = true; this.btnSubmit.Enabled = true; }); } /// <summary> /// 媒体文件名非法字符过滤 /// </summary> /// <param name="input"></param> /// <returns></returns> private string RemoveSpecialChar(string input) { string[] aryChar = { "\"\"", "/", ":", "*", "?", "|", "<", ">", """, "&", " ", "+", "=", ",", "'", "%", "#", }; for (int i = 0; i < aryChar.Length; i++) { input = input.Replace(aryChar[i], string.Empty); } return input; } /// <summary> /// 媒体导入方法 /// </summary> /// <param name="obj"></param> private void MediaImport(object obj) { Thread.Sleep(150); object[] objs = (object[])obj; string file = (string)objs[0]; string path = (string)objs[1]; int folderId = (int)objs[2]; int j = (int)objs[3];try
{ if (!File.Exists(file)) { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = "文件[" + file + "]不存在!"; lvImport.Items[j].ImageIndex = 2; }); } else { FileInfo fileInfo = new FileInfo(file); MediaFileInfo info = new MediaFileInfo(); if (!mediaFileService.AnalyseAndSetMediaFileInfo(info, fileInfo)) { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = "获取文件[" + file + "]信息失败!"; lvImport.Items[j].ImageIndex = 2; }); } else { string copyDir = string.Empty; string copyToFile = string.Empty; string retavl = string.Empty;info.Path = path;
retavl = mediaService.MediaInfoCheck(info); if (retavl.Length == 0) { copyDir = Path.Combine(Path.Combine(Application.StartupPath, "resource"), path); if (!Directory.Exists(copyDir)) Directory.CreateDirectory(copyDir);//string fName = RemoveSpecialChar(fileInfo.Name);
string fName = fileInfo.Name; info.Name = fName;copyToFile = Path.Combine(copyDir, fName);
int copyLength = 0;long fLength = fileInfo.Length;
using (FileStream stream = File.Open(copyToFile, FileMode.Create, FileAccess.Write)) { using (FileStream fileStream = fileInfo.OpenRead()) { int btLength = 256 * 1024;//256k byte[] buffer = new byte[btLength]; int readCount = 0; while ((readCount = fileStream.Read(buffer, 0, btLength)) > 0) { //if (isAbort) //{ // File.Delete(copyToFile); // break; //} int tolPercent = 0; copyLength += readCount;//已经复制大小 stream.Write(buffer, 0, readCount); tolPercent = (int)((float)(copyLength / (float)fLength * 100)); Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[3].Text = tolPercent.ToString() + "%"; lvImport.Items[j].SubItems[4].Text = "正在导入!"; }); } } } retavl = mediaService.CreateAndSaveAsMediaInfo(folderId, copyToFile, info); if (retavl.Length == 0) { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = "成功导入!"; lvImport.Items[j].ImageIndex = 0; mediaUC.MediaLViewBind(folderId);//刷新父窗体列表 }); } else { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = retavl; lvImport.Items[j].ImageIndex = 2; }); } } else { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = retavl; lvImport.Items[j].ImageIndex = 2; }); } } } } catch (Exception ex) { Program.ThreadSafe(this, delegate { lvImport.Items[j].SubItems[4].Text = ex.Message; lvImport.Items[j].ImageIndex = 2; }); Dare.DN.Services.Application.Instance.Logger.ErrorFormat("MediaImportFrm-MediaImport-错误原因:{0}", ex.Message); } iAutoReset[j].Set(); } /// <summary> /// 突破64个阻塞线程方法 /// </summary> /// <param name="waitHandles"></param> private static void WaitAll(WaitHandle[] waitHandles) { if (waitHandles == null) throw new ArgumentNullException("阻塞参数非空!"); foreach (WaitHandle waitHandle in waitHandles) { waitHandle.WaitOne(); } } private void Form1_MouseDown(object sender, EventArgs e) { parentForm1.MouseMoveEvent(this.Handle); } private void parentForm1_onMinEvent(object sender, EventArgs e) { this.WindowState = FormWindowState.Minimized; }private void parentForm1_onMaxEvent(object sender, EventArgs e)
{ if (isNormal) { isNormal = false; this.WindowState = FormWindowState.Normal; } else { isNormal = true; this.WindowState = FormWindowState.Maximized; } this.parentForm1.MaxmizeIcon(this.WindowState == FormWindowState.Maximized); } private void parentForm1_onCloseEvent(object sender, EventArgs e) { //isAbort = true; RestBackWork(); this.Close(); } private void btnClose_Click(object sender, EventArgs e) { //isAbort = true; RestBackWork(); this.Close(); }protected override void OnClosed(EventArgs e)
{ base.OnClosed(e); }private void RestBackWork()
{ if (iThreads != null) { foreach (Thread thread in iThreads) { thread.Abort(); } } iThreads = null; importBgWorker = null; bkWork = null; } private void btnImport_Click(object sender, EventArgs e) { RestBackWork(); string rootPath = Path.GetPathRoot(Application.StartupPath); DriveInfo drive = new DriveInfo(rootPath); if (drive.AvailableFreeSpace < 1024 * 1024) { MessageBox.Show(this, "对不起,当前磁盘[" + rootPath + "]剩余空间[" + new FileSizeData(drive.AvailableFreeSpace).ToString() + "],请清理磁盘空间!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } using (OpenFileDialog ofd = new OpenFileDialog()) { string[] iFiles = null; int rootFolderId=0; rootFolderId = folderService.GetMediaFolderRootParentId(folderId); switch (rootFolderId) { case 1: ofd.Title = "导入audio文件";//resource\audio ofd.Filter = "音频文件(*.wav,*.mp3,*.aac,*.wma)|*.wav;*.mp3;*.aac;*.wma"; break; case 2: ofd.Title = "导入background文件";//resource\background ofd.Filter = "背景文件(*.bmp,*.jpg,*.jpeg,*.png,*.gif,*.tif,*.tiff)|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tif;*.tiff"; break; case 3: ofd.Title = "导入image文件";//resource\image ofd.Filter = "图片文件(*.bmp,*.jpg,*.jpeg,*.png,*.gif,*.tif,*.tiff)|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tif;*.tiff"; break; case 7: ofd.Title = "导入text文件";//resource\text ofd.Filter = "文本文件(*.txt)|*.txt"; break; case 8: ofd.Title = "导入video文件";//resource\video ofd.Filter = "视频文件(*.mpg,*.mpeg,*.vob,*.avi,*.mkv,*.mov,*.mp4,*.flv,*.wmv,*.ts,*.trp)|*.mpg;*.mpeg;*.vob;*.avi;*.mkv;*.mov;*.mp4;*.flv;*.wmv;*.ts;*.trp"; break; case 9: ofd.Title = "导入document文件";//resource\text ofd.Filter = "文档文件(*.ppt,*.pptx)|*.ppt;*.pptx"; break; default://resource\unknow break; } ofd.Multiselect = true; if (ofd.ShowDialog() == DialogResult.OK) { int maxCount = Dare.DN.Services.Application.Instance.AppSettings.MediaMaxCount; iFiles = ofd.FileNames; if (iFiles.Length > maxCount) { MessageBox.Show(this, string.Format("对不起,一次最多只能导入{0}个媒体文件!", maxCount.ToString()), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }bool isResult = false;
foreach (string file in iFiles) { string extName = Path.GetExtension(file).ToLower(); if (extName == ".ppt" || extName == ".pptx") { if (!PowerPointHelper.IsPowerPointInstalled()) { isResult = true; break; } } }if (isResult)
{ MessageBox.Show(this, "未发现Microsoft PowerPoint 2000及以上版本安装于本机!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; }//同名文件集合
List<string> listFiles = new List<string>(); //无同名文件集合 List<string> listNoFiles = new List<string>(); foreach (string file in iFiles) { string name = Path.GetFileName(file); //if (mediaService.IsMediaExsit(folderId, RemoveSpecialChar(name))) if (mediaService.IsMediaExsit(folderId, name)) { listFiles.Add(name); } else { listNoFiles.Add(file); } }if (listFiles.Count > 0)
{ string filesShow = string.Empty; filesShow = String.Join("\r\n", listFiles.ToArray()); #region //if (MessageBox.Show(this, string.Format("系统已存在下列同名文件:\r\n\r\n{0}\r\n\r\n按【是】全部覆盖,按【否】跳过重复.", filesShow.Length > 200 ? filesShow.Substring(0, 200) + "\r\n............................." : filesShow), "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) //{ // mFiles = iFiles; //} //else //{ // if (listNoFiles.Count > 0) // { // mFiles = listNoFiles.ToArray(); // } // else // { // //MessageBox.Show(this, "文件全部重复,没有可跳过项!", "提示", MessageBoxButtons.OK,MessageBoxIcon.Information); // return; // } //} #endregion MessageBox.Show(this, string.Format("系统已存在下列同名文件:\r\n\r\n{0}\r\n\r\n请更换名称后,再导入.", filesShow.Length > 200 ? filesShow.Substring(0, 200) + "\r\n............................." : filesShow), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else { mFiles = iFiles; }mCount = mFiles.Length;
bkWork = new BackgroundWorker(); bkWork.DoWork += new DoWorkEventHandler(bkWork_DoWork); if (!bkWork.IsBusy) { bkWork.RunWorkerAsync(); } } } }void bkWork_DoWork(object sender, DoWorkEventArgs e)
{ StartMedia(bkWork, e); }private void importFdMenuItem_Click(object sender, EventArgs e)
{ btnImport_Click(sender,e); } }}