C# winform 广告机 网络多媒体发布系统桌面版之三

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 = { "\"\"", "/", ":", "*", "?", "|", "&lt;", "&gt;", "&quot;", "&amp;", " ", "+", "=", ",", "'", "%", "#", };
            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);
        }
    }
}

posted @ 2011-08-20 16:50  火腿骑士  阅读(799)  评论(0编辑  收藏  举报