/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="handler"></param> public void Issue(LocalStudentWorkStore store,RaiseChangedHandler handler) { lock (this) { if (store == null || store.Students == null) { this.RaiseChanged(handler, "没有作品分发!"); MessageBox.Show("没有作品分发!"); return; } else if(this.netService != null && this.panelWork != null && this.panelWork.Controls != null) { bool flag = false; for (int i = 0; i < this.panelWork.Controls.Count; i++) { StudentControl sc = this.panelWork.Controls[i] as StudentControl; if (sc != null && sc.UserInfo != null && ((sc.State & StudentControl.EnumStudentState.Online) == StudentControl.EnumStudentState.Online)) { flag = true; this.IssueWorkData(store,store.Students[sc.UserInfo.UserID], handler); } } if (!flag) { string msg = "没有在线学生可分发作品数据!"; this.RaiseChanged(handler, msg); MessageBox.Show(msg); } } } }
/// <summary> /// 导入。 /// </summary> /// <param name="stream"></param> /// <param name="teacherId"></param> /// <param name="handler"></param> public void Import(WorkExportImportManifest mainfest,RaiseChangedHandler handler) { if (!string.IsNullOrEmpty(this.teacherID) && !string.IsNullOrEmpty(this.teacherName) && mainfest != null && mainfest.Storages != null && mainfest.Storages.Count > 0) { for (int i = 0; i < mainfest.Storages.Count; i++) { this.ImportWorkData(mainfest.Storages[i], handler); } } }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="students"></param> /// <param name="dir"></param> /// <param name="zipFile"></param> /// <param name="handler"></param> private void ImportWorkFiles(LocalStudentWorkStore store, LocalStudents students, string dir, ZipFile zipFile, RaiseChangedHandler handler) { if (store != null && students != null && students.Count > 0 && zipFile != null) { foreach (LocalStudent ls in students) { if (ls.HasWork()) { LocalStudentWork lsw = ls.Work; if (lsw.WorkFiles != null && lsw.WorkFiles.Count > 0) { string zipDir = string.Format("{0}{1}{2}{1}", dir, Path.DirectorySeparatorChar, ls.StudentID); this.RaiseChanged(handler, string.Format("导入[{0},{1}]作品数据...", ls.StudentName, ls.StudentCode)); foreach (LocalStudentWorkFile lswf in lsw.WorkFiles) { string sPath = string.Format("{0}{1}{2}", zipDir, lswf.FileID, lswf.FileExt); try { using (Stream stream = ZipUtils.ZipFileData(zipFile, sPath)) { if (stream != null) { this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; int len = 0; while ((len = stream.Read(buf, 0, buf.Length)) > 0) { fs.Write(buf, 0, len); } } } } } catch (Exception x) { Exception t = new Exception(string.Format("[{0},{1}]{2}{3}:{4}", ls.StudentName, ls.StudentCode, lswf.FileName, lswf.FileExt, sPath), x); UtilTools.OnExceptionRecord(t, typeof(ImportWorkUtils)); } } } } } } }
/// <summary> /// /// </summary> /// <param name="mainfest"></param> /// <param name="zipFile"></param> /// <param name="isImportFile"></param> private void ImportWorkData(ExportImportManifest mainfest, ZipFile zipFile, bool isImportFile, RaiseChangedHandler handler) { if (mainfest != null && mainfest.ClassID_CatalogID != null && mainfest.ClassID_CatalogID.Length > 0 && zipFile != null) { for (int i = 0; i < mainfest.ClassID_CatalogID.Length; i++) { if (!string.IsNullOrEmpty(mainfest.ClassID_CatalogID[i])) { string[] arr = mainfest.ClassID_CatalogID[i].Split('_'); if (arr != null && arr.Length > 1) { this.ImportWorkData(mainfest.ClassID_CatalogID[i], arr[0], arr[1], zipFile, isImportFile, handler); } } } } }
/// <summary> /// /// </summary> /// <param name="dir"></param> /// <param name="classID"></param> /// <param name="catalogID"></param> /// <param name="zipFile"></param> /// <param name="isImportFile"></param> /// <param name="handler"></param> private void ImportWorkData(string dir, string classID, string catalogID, ZipFile zipFile, bool isImportFile, RaiseChangedHandler handler) { string filename = string.Format("{0}{1}TSW_{2}_{3}.cfg.xml", dir, Path.DirectorySeparatorChar,classID, catalogID); using (Stream stream = ZipUtils.ZipFileData(zipFile, filename)) { LocalStudentWorkStore importStore = UtilTools.DeSerializer<LocalStudentWorkStore>(stream); if (importStore != null && (importStore.Students != null) && (importStore.Students.Count > 0) && !string.IsNullOrEmpty(this.teacherID)) { LocalStudentWorkStore localStore = LocalStudentWorkStore.DeSerializer(this.teacherID, catalogID, classID); if (localStore != null) { #region 更新学生作品信息数据。 this.RaiseChanged(handler, string.Format("导入[{0},{1}]", importStore.ClassName, importStore.CatalogName)); if (localStore.Students == null) { localStore.Students = new LocalStudents(); } foreach (LocalStudent ls in importStore.Students) { LocalStudent student = localStore.Students[ls.StudentID]; if (student == null) { localStore.Students.Add(ls); } else { student = ls; } } #endregion this.RaiseChanged(handler, string.Format("更新[{0},{1}]记录文件...", localStore.ClassName, localStore.CatalogName)); //更新记录文件。 this.CorrectWorkFileSuffix(localStore); WorkStoreHelper.Serializer(ref localStore); //localStore.Serializer(); //导入学生作品数据。 if (isImportFile) { this.RaiseChanged(handler, string.Format("开始导入[{0},{1}]学生作品数据...", localStore.ClassName, localStore.CatalogName)); this.ImportWorkFiles(localStore, importStore.Students, dir, zipFile, handler); } } else { this.RaiseChanged(handler, string.Format("更新[{0},{1}]记录文件...", importStore.ClassName, importStore.CatalogName)); this.CorrectWorkFileSuffix(importStore); WorkStoreHelper.Serializer(ref importStore); //importStore.Serializer(); //导入作品数据。 this.RaiseChanged(handler, string.Format("开始导入[{0},{1}]学生作品数据...", importStore.ClassName, importStore.CatalogName)); this.ImportWorkFiles(importStore, importStore.Students, dir, zipFile, handler); } } } }
/// <summary> /// 导出数据。 /// </summary> /// <param name="outputFilePath"></param> /// <param name="handler"></param> public void Export(string outputFilePath, RaiseChangedHandler handler) { lock (this) { if (nodes != null && nodes.Count > 0 && !string.IsNullOrEmpty(outputFilePath)) { this.RaiseChanged(handler, "开始检索数据..."); Stack<NodeValue> stack = null; Dictionary<String, List<String>> dict = new Dictionary<string, List<string>>(); foreach (TreeNode n in nodes) { stack = new Stack<NodeValue>(); this.GetAllNodeValue(n, stack); if (stack.Count > 0) { this.SetOutputData(stack.ToArray(), ref dict); } } ExportImportManifest mainfset = new ExportImportManifest("2.0"); mainfset.TeacherID = this.teacherID; List<String> list_ClassID_CatalogID = new List<string>(); List<LocalStudentWorkStore> listStore = new List<LocalStudentWorkStore>(); if (dict != null && dict.Count > 0) { #region 检索存储文件。 this.RaiseChanged(handler, "开始加载检索文件..."); foreach (string key in dict.Keys) { string[] arr = key.Split('_'); if (arr != null && arr.Length > 1) { LocalStudentWorkStore store = LocalStudentWorkStore.DeSerializer(this.teacherID, arr[1], arr[0]); if (store != null && store.Students != null) { list_ClassID_CatalogID.Add(key); List<String> list = dict[key]; if (list != null && list.Count > 0 && (list.Count != store.Students.Count)) { List<LocalStudent> removeStudents = new List<LocalStudent>(); foreach (LocalStudent ls in store.Students) { if (!list.Contains(ls.StudentID)) { removeStudents.Add(ls); } } if (removeStudents.Count > 0) { store.Students.Remove(removeStudents.ToArray()); } } listStore.Add(store); } } } #endregion } if (listStore.Count > 0) { mainfset.ClassID_CatalogID = list_ClassID_CatalogID.ToArray(); this.RaiseChanged(handler, "创建导出清单文件..."); outputFilePath = outputFilePath.Replace(Path.GetExtension(outputFilePath), ".zip"); using (FileStream outputStream = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) { this.RaiseChanged(handler, "创建压缩文件..."); Crc32 crc = new Crc32(); using (ZipOutputStream zipStream = new ZipOutputStream(outputStream)) { zipStream.SetLevel(9); byte[] data = UtilTools.Serializer<ExportImportManifest>(mainfset); if (data != null) { this.RaiseChanged(handler, "压缩导出清单文件..."); ZipEntry entry = new ZipEntry("ExportImportManifest.xml"); entry.DateTime = DateTime.Now; entry.Size = data.Length; crc.Reset(); crc.Update(data); entry.Crc = crc.Value; zipStream.PutNextEntry(entry); zipStream.Write(data, 0, data.Length); zipStream.CloseEntry(); } this.RaiseChanged(handler, "开始抽取压缩作品数据..."); this.BuildZipFile(zipStream,crc, listStore, handler); this.RaiseChanged(handler, "压缩作品数据完成"); } } this.RaiseChanged(handler, "作品数据导出完成"); } } } }
/// <summary> /// /// </summary> /// <param name="zipStream"></param> /// <param name="crc"></param> /// <param name="listStore"></param> /// <param name="handler"></param> private void BuildZipFile(ZipOutputStream zipStream,Crc32 crc, List<LocalStudentWorkStore> listStore, RaiseChangedHandler handler) { foreach (LocalStudentWorkStore store in listStore) { string root = string.Format("{0}_{1}", store.ClassID, store.CatalogID); byte[] data = UtilTools.Serializer<LocalStudentWorkStore>(store); if (data != null && data.Length > 0) { this.RaiseChanged(handler, string.Format("开始压缩[{0},{1}]...", store.ClassName, store.CatalogName)); this.BuildZipData(zipStream, crc, data, string.Format("{0}{1}TSW_{2}_{3}.cfg.xml", root, Path.DirectorySeparatorChar,store.ClassID, store.CatalogID)); if (store.Students != null && store.Students.Count > 0) { this.RaiseChanged(handler, "开始压缩学生作品..."); foreach (LocalStudent ls in store.Students) { string dir = string.Format("{0}{1}{2}{1}", root, Path.DirectorySeparatorChar,ls.StudentID); if (ls.HasWork()) { LocalStudentWork lsw = ls.Work; if (lsw.WorkFiles != null && lsw.WorkFiles.Count > 0) { foreach (LocalStudentWorkFile f in lsw.WorkFiles) { string path = lsw.StudentWorkFilePath(store, ls, f); if (File.Exists(path)) { this.RaiseChanged(handler, string.Format("开始压缩学生作品[{0},{1}{2}]...", ls.StudentName, f.FileName, f.FileExt)); using (MemoryStream ms = new MemoryStream()) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { int len = 0; byte[] buf = new byte[512]; while ((len = fs.Read(buf, 0, buf.Length)) > 0) { ms.Write(buf, 0, len); } } this.BuildZipData(zipStream, crc, ms.ToArray(), string.Format("{0}{1}{2}", dir, f.FileID, f.FileExt)); } } } } } } this.RaiseChanged(handler, "压缩学生作品完成"); } } } }
/// <summary> /// 创建静态实例。 /// </summary> /// <param name="service"></param> /// <param name="Changed"></param> /// <returns></returns> public static TeaClientServicePoxyFactory Instance(ICoreService service, RaiseChangedHandler changed) { lock (typeof(TeaClientServicePoxyFactory)) { Credentials cert = service["credentials"] as Credentials; if (cert == null) { throw new Exception("容器中密钥丢失!请关闭系统后重新登录!"); } TeaClientServicePoxyFactory factory = PoxyCache[cert] as TeaClientServicePoxyFactory; if (factory == null) { factory = new TeaClientServicePoxyFactory(cert); PoxyCache[cert] = factory; } factory.Changed = changed; return factory; } }
/// <summary> /// 导出学生作品文件。 /// </summary> /// <param name="studentID">学生ID。</param> /// <param name="target">目标目录。</param> /// <param name="changed"></param> /// <returns>导出作品目录。</returns> public string OutputWorkFile(string studentID, string target, RaiseChangedHandler changed) { lock (this) { if (!string.IsNullOrEmpty(studentID) && !string.IsNullOrEmpty(target)) { string targetDir = Path.GetFullPath(string.Format("{0}/{1}/{2}/{3}", target, this.TeacherName, this.CatalogName, this.ClassName)); if (!Directory.Exists(targetDir)) { this.OnChanged(changed, "创建目录:" + targetDir); Directory.CreateDirectory(targetDir); } if (this.Students != null && this.Students.Count > 0) { LocalStudent ls = this.Students[studentID]; if (ls != null && ls.HasWork()) { #region 创建导出目录。 string targetRoot = Path.GetFullPath(string.Format("{0}/{1}", targetDir, ls.StudentName)); if (!Directory.Exists(targetRoot)) { Directory.CreateDirectory(targetRoot); this.OnChanged(changed, "创建目录:" + ls.StudentName); } else { try { //删除目录下的文件。 string[] files = Directory.GetFiles(targetRoot, "*.*"); if (files != null && files.Length > 0) { for (int k = 0; k < files.Length; k++) { if (File.Exists(files[k])) { File.Delete(files[k]); } } } } catch (Exception) { } } #endregion #region 作业。 int fcount = 0; if (ls.Work.WorkFiles != null && (fcount = ls.Work.WorkFiles.Count) > 0) { for(int i = 0; i < fcount; i++) { #region 作业数据。 LocalStudentWorkFile f = ls.Work.WorkFiles[i]; string sourcePath = ls.Work.StudentWorkFilePath(this, ls, f); if (File.Exists(sourcePath)) { try { string targetPath = Path.GetFullPath(string.Format("{0}/{1}{2}", targetRoot, f.FileName, f.FileExt)); using (FileStream source = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) { using (FileStream output = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) { this.OnChanged(changed, "开始创建文件:" + f.FileName); byte[] buf = new byte[512]; int len = 0; while ((len = source.Read(buf, 0, buf.Length)) > 0) { output.Write(buf, 0, len); } this.OnChanged(changed, "创建文件:" + f.FileName + "完成"); } } } catch (Exception x) { this.OnChanged(changed, "创建文件[" + f.FileName + "]时发生异常:" + x.Message); Program.GlobalExceptionHandler(x); } } #endregion } } #endregion return targetRoot; } } } return null; } }
///// <summary> ///// 清理冗余作品。 ///// </summary> ///// <param name="changed"></param> //public bool ClearWorks(RaiseChangedHandler changed) //{ // lock (this) // { // bool result = false; // try // { // if (this.Students != null && this.Students.Count > 0) // { // Hashtable htCache = Hashtable.Synchronized(new Hashtable()); // for (int i = 0; i < this.Students.Count; i++) // { // LocalStudent ls = this.Students[i]; // if (ls != null && ls.Works != null && ls.Works.Count > 0) // { // #region 剔除重复学生。 // if (htCache.ContainsKey(ls.StudentID)) // { // result = true; // LocalStudent old = ((object[])htCache[ls.StudentID])[0] as LocalStudent; // if (old.Works != null && old.Works.Count > 0) // { // if (ls.Works != null && ls.Works.Count > 0) // { // if (ls.Works[0].Time < old.Works[0].Time) // { // this.OnChanged(changed, string.Format("清理{0}的冗余作品", ls.StudentName)); // this.Students.Remove(i); // continue; // } // else // { // this.OnChanged(changed, string.Format("清理{0}的冗余作品", old.StudentName)); // this.Students.Remove((int)(((object[])htCache[ls.StudentID])[1])); // } // } // else // { // this.OnChanged(changed, string.Format("清理{0}的冗余作品", ls.StudentName)); // this.Students.Remove(i); // continue; // } // } // else // { // this.OnChanged(changed, string.Format("清理{0}的冗余作品", old.StudentName)); // this.Students.Remove((int)(((object[])htCache[ls.StudentID])[1])); // } // } // #endregion // #region 剔除冗余作业。 // if (ls.Works != null && ls.Works.Count > 1) // { // ls.Works.Sort(); // LocalStudentWork lsw = ls.Works[0]; // if (lsw != null) // { // this.OnChanged(changed, string.Format("清理{0}的冗余作品,保留作品:{1}", ls.StudentName, lsw.WorkName)); // ls.Works = new LocalStudentWorks(); // ls.Works.Add(lsw); // result = true; // } // } // #endregion // //缓存数据。 // htCache[ls.StudentID] = new object[] { ls, i }; // } // } // } // if (result) // { // this.Serializer(); // } // this.OnChanged(changed, "清理完毕!"); // } // catch (Exception x) // { // this.OnChanged(changed, string.Format("清理发生异常:{0}", x.Message)); // } // return result; // } //} /// <summary> /// 消息处理。 /// </summary> /// <param name="changed"></param> /// <param name="message"></param> private void OnChanged(RaiseChangedHandler changed, string message) { if (changed != null) { changed(message); } }
/// <summary> /// 导出所有学生作品数据。 /// </summary> /// <param name="target">目标目录。</param> /// <param name="Changed">消息处理。</param> public void OutputAllWorkFiles(string target, RaiseChangedHandler changed) { lock (this) { int len = 0; if (this.Students != null && (len = this.Students.Count) > 0) { for(int i = 0; i < len; i++) { LocalStudent ls = this.Students[i]; this.OutputWorkFile(ls.StudentID, target, changed); } } } }
/// <summary> /// 更新程序。 /// </summary> /// <param name="handler">消息委托。</param> /// <returns></returns> public bool Updates(RaiseChangedHandler handler) { handler("开始下载更新,请稍后..."); string path = string.Format("{0}/Update_{1:yyyyMMddHHmmss}.zip", Application.StartupPath, DateTime.Now); if (this.Download(path)) { handler("下载完毕,准备更新..."); List<string> kills = new List<string>(); #region 关闭宿主程序。 handler("关闭宿主程序..."); string[] runs = Directory.GetFiles(Application.StartupPath, "*.exe"); string current = Path.GetFileNameWithoutExtension(Application.ExecutablePath); for (int i = 0; i < runs.Length; i++) { if (runs[i].ToLower().IndexOf(current.ToLower()) == -1) { string pn = Path.GetFileNameWithoutExtension(runs[i]); Process[] pros = Process.GetProcessesByName(pn); if (pros != null && pros.Length > 0) { foreach (Process p in pros) { if (!p.HasExited) { try { p.Kill(); if (runs[i].ToLower().IndexOf(".vshosts.") == -1) { kills.Add(runs[i]); } Thread.Sleep(500); } catch (Exception e) { logger.Error("关闭宿主程序[" + p + "]发生异常:" + e.Message); continue; } } } } } } #endregion #region 解压更新。 handler("解压更新中,请稍后..."); string dir = Application.StartupPath; ZipTools.UnZip(path, new UnZipStreamHanlder(delegate(string filename, Stream stream) { try { if (!string.IsNullOrEmpty(filename) && stream != null) { handler("update:" + Path.GetFileNameWithoutExtension(filename)); string fp = Path.GetFullPath(string.Format("{0}/{1}", dir, filename)); using (FileStream fs = new FileStream(fp, FileMode.Create, FileAccess.Write)) { int len = 0; byte[] buf = new byte[1024]; while ((len = stream.Read(buf, 0, buf.Length)) > 0) { fs.Write(buf, 0, len); } } } } catch (Exception e) { string err = string.Format("更新文件[{0}]发生异常:{1}", filename, e.Message); logger.Error(err); handler(err); } })); #endregion handler("更新完成,启动宿主程序..."); this.UpdateSuccess(); #region 启动宿主程序。 if (kills.Count > 0) { foreach (string s in kills) { if (File.Exists(s)) { try { Process.Start(s); } catch (Exception e) { logger.Error("启动宿主程序[" + s + "]发生异常:" + e.Message); continue; } } } } #endregion return true; } return false; }
/// <summary> /// /// </summary> /// <param name="storage"></param> /// <param name="handler"></param> private void ImportWorkData(StudentWorkTeaStorage storage,RaiseChangedHandler handler) { lock (this) { if (string.IsNullOrEmpty(this.teacherID) || string.IsNullOrEmpty(this.teacherName)) { return; } if (this.zipFile != null && storage != null && !string.IsNullOrEmpty(storage.CatalogID) && !string.IsNullOrEmpty(storage.ClassID) && (storage.Student != null) && !string.IsNullOrEmpty(storage.Student.StudentID)) { LocalStudentWorkStore store = LocalStudentWorkStore.DeSerializer(this.teacherID, storage.CatalogID, storage.ClassID); #region 初始化数据。 if (store == null) { store = new LocalStudentWorkStore(); store.TeacherID = this.teacherID; store.TeacherName = this.teacherName; store.GradeID = storage.GradeID; store.GradeName = null; store.CatalogID = storage.CatalogID; store.CatalogName = storage.CatalogName; store.ClassID = storage.ClassID; store.ClassName = null; store.Evaluate = null; } #endregion if (store.Students == null) { store.Students = new LocalStudents(); } LocalStudent ls = store.Students[storage.Student.StudentID]; if (ls == null) { ls = new LocalStudent(); ls.StudentID = storage.Student.StudentID; ls.StudentCode = storage.Student.StudentCode; ls.StudentName = storage.Student.StudentName; store.Students.Add(ls); } if (ls.Work == null) ls.Work = new LocalStudentWork(); ls.Work.WorkID = storage.WorkID; ls.Work.WorkName = storage.WorkName; ls.Work.UploadIP = storage.UploadIP; ls.Work.Type = storage.Type; ls.Work.Time = storage.Time; ls.Work.Status = storage.Status; if (storage.Review != null) { ls.Work.Review = new LocalWorkReview(); ls.Work.Review.ReviewValue = storage.Review.ReviewValue; ls.Work.Review.SubjectiveReviews = storage.Review.SubjectiveReviews; ls.Work.Review.TeacherID = storage.Review.TeacherID; ls.Work.Review.TeacherName = storage.Review.TeacherName; } ls.Work.FileExt = storage.FileExt; ls.Work.Description = storage.Description; //ls.Work.CheckCode = storage.CheckCode; this.RaiseChanged(handler, string.Format("导入[{0},{1}]作品数据...", ls.StudentName, ls.StudentCode)); if (this.isImportFile && !string.IsNullOrEmpty(storage.WorkPath)) { //导入文件。 ls.Work.WorkFiles = new LocalStudentWorkFiles(); this.ImportWorkFiles(storage.WorkPath, store, ls, ls.Work, handler); } //序列化保存。 WorkStoreHelper.Serializer(ref store); } } }
/// <summary> /// /// </summary> /// <param name="handler"></param> /// <param name="message"></param> private void RaiseChanged(RaiseChangedHandler handler, string message) { if (handler != null) { handler(message); } }
/// <summary> /// /// </summary> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="handler"></param> private void IssueWorkData(LocalStudentWorkStore store,LocalStudent ls, RaiseChangedHandler handler) { lock (this) { if (store != null && ls != null && ls.HasWork()) { LocalStudentWork lsw = ls.Work; int len = 0; if (lsw.WorkFiles != null && (len = lsw.WorkFiles.Count) > 0) { this.RaiseChanged(handler, string.Format("下发[{0},{1}]作品数据{2}", ls.StudentName, ls.StudentCode, lsw.WorkName)); string[] filePaths = new string[len]; for (int i = 0; i < len; i++) { filePaths[i] = lsw.StudentWorkFilePath(store, ls, lsw.WorkFiles[i]); } byte[] data = ZipUtils.Zip(filePaths); if (data != null && data.Length > 0) { IssueWorkFile issue = new IssueWorkFile(); issue.StudentID = ls.StudentID; issue.WorkName = lsw.WorkName; issue.UID = store.TeacherID; issue.Time = DateTime.Now; issue.Data = data; this.netService.SendIssueWork(issue); } else { this.RaiseChanged(handler, string.Format("压缩数据文件失败![{0},{1}]", ls.StudentName, lsw.WorkName)); } } } } }
/// <summary> /// /// </summary> /// <param name="filepath"></param> /// <param name="isImportFile"></param> /// <param name="handler"></param> public void Import(string filepath, bool isImportFile, RaiseChangedHandler handler) { if (!string.IsNullOrEmpty(filepath) && File.Exists(filepath)) { this.RaiseChanged(handler, "读取文件..."); if (!string.Equals(Path.GetExtension(filepath), ".zip", StringComparison.InvariantCultureIgnoreCase)) { this.RaiseChanged(handler, "文件后缀非zip格式!"); return; } try { using (FileStream inputStream = new FileStream(filepath, FileMode.Open, FileAccess.Read)) { this.RaiseChanged(handler, "校验文件格式..."); using (ZipFile zipFile = new ZipFile(inputStream)) { using (Stream stream = ZipUtils.ZipFileData(zipFile, "ExportImportManifest.xml")) { if (stream == null) { this.RaiseChanged(handler, "该压缩文件不是学生作品数据文件!"); return; } else { using (MemoryStream ms = new MemoryStream()) { int len = 0; byte[] buf = new byte[512]; while ((len = stream.Read(buf, 0, buf.Length)) > 0) { ms.Write(buf, 0, len); } ms.Position = 0; XmlDocument docfest = new XmlDocument(); docfest.Load(ms); ms.Position = 0; XmlElement ver = docfest.SelectSingleNode("//Ver") as XmlElement; if (ver != null && !string.IsNullOrEmpty(ver.InnerText)) { float fVer = 0; if (float.TryParse(ver.InnerText, out fVer)) { if (fVer == 1.0) { #region 旧版本。 WorkExportImportManifest mainfest = UtilTools.DeSerializer<WorkExportImportManifest>(ms); if (mainfest == null) { this.RaiseChanged(handler, "该学生作品数据文件版本不能被解析!"); return; } else { ImportOldVersionWorkUtils oldImport = new ImportOldVersionWorkUtils(this.teacherID, this.teacherName, zipFile, isImportFile); oldImport.Import(mainfest, handler); this.RaiseChanged(handler, "学生作品数据导入完成!"); } #endregion } else if (fVer == 2.0) { #region 新版本。 ExportImportManifest mainfest = UtilTools.DeSerializer<ExportImportManifest>(ms); if (mainfest == null) { this.RaiseChanged(handler, "该学生作品数据文件版本不能被解析!"); return; } else if (!string.IsNullOrEmpty(mainfest.TeacherID) && string.Equals(mainfest.TeacherID, this.teacherID, StringComparison.InvariantCultureIgnoreCase)) { this.RaiseChanged(handler, "开始导入学生作品数据信息..."); this.ImportWorkData(mainfest, zipFile, isImportFile, handler); this.RaiseChanged(handler, "学生作品数据信息导入完成"); } else { this.RaiseChanged(handler, "该学生作品数据文件不属于当前教师用户,不能导入!"); return; } #endregion } else { this.RaiseChanged(handler, string.Format("该学生作品数据文件版本号[{0}]不能被解析!", ver.InnerText)); return; } } else { this.RaiseChanged(handler, string.Format("该学生作品数据文件版本号[{0}]格式不正确,不能被解析!", ver.InnerText)); return; } } else { this.RaiseChanged(handler, "该学生作品数据文件版本不能被解析!"); return; } } } } } } } catch (Exception x) { this.RaiseChanged(handler, x.Message); MessageBox.Show("发生异常:" + x.Message); } } }
/// <summary> /// /// </summary> /// <param name="zipWorkPath"></param> /// <param name="store"></param> /// <param name="ls"></param> /// <param name="lsw"></param> /// <param name="handler"></param> private void ImportWorkFiles(string zipWorkPath, LocalStudentWorkStore store, LocalStudent ls, LocalStudentWork lsw, RaiseChangedHandler handler) { if (this.zipFile != null && !string.IsNullOrEmpty(zipWorkPath)) { Stream stream = stream = ZipUtils.ZipFileData(this.zipFile, zipWorkPath); if (stream != null) { if (string.Equals(Path.GetExtension(zipWorkPath), ".zip", StringComparison.InvariantCultureIgnoreCase)) { #region 压缩文件解压。 using (ZipInputStream zipStream = new ZipInputStream(stream)) { if (zipStream == null) { return; } ZipEntry entry = null; while ((entry = zipStream.GetNextEntry()) != null) { if (entry != null && entry.IsFile && !string.IsNullOrEmpty(entry.Name)) { LocalStudentWorkFile lswf = new LocalStudentWorkFile(); lswf.FileID = string.Format("{0}", Guid.NewGuid()).Replace("-", string.Empty); lswf.FileExt = Path.GetExtension(entry.Name); lswf.FileName = Path.GetFileNameWithoutExtension(entry.Name); if (string.IsNullOrEmpty(lsw.FileExt)) { lsw.FileExt = lswf.FileExt; } else if (lsw.FileExt.IndexOf(lswf.FileExt) == -1) { lsw.FileExt += "|" + lswf.FileExt; } lswf.Size = entry.Size; lsw.WorkFiles.Add(lswf); this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; int len = 0; while ((len = zipStream.Read(buf, 0, buf.Length)) > 0) { fs.Write(buf, 0, len); } } } } } #endregion } else { #region 导入单独文件。 LocalStudentWorkFile lswf = new LocalStudentWorkFile(); lswf.FileID = string.Format("{0}", Guid.NewGuid()).Replace("-", string.Empty); lswf.FileName = lsw.WorkName; lswf.FileExt = Path.GetExtension(zipWorkPath); if (string.IsNullOrEmpty(lsw.FileExt)) { lsw.FileExt = lswf.FileExt; } else if (lsw.FileExt.IndexOf(lswf.FileExt) == -1) { lsw.FileExt += "|" + lswf.FileExt; } lswf.Size = stream.Length; lsw.WorkFiles.Add(lswf); this.RaiseChanged(handler, string.Format("导入作品{0}{1}...", lswf.FileName, lswf.FileExt)); using (FileStream fs = new FileStream(lsw.StudentWorkFilePath(store, ls, lswf), FileMode.Create, FileAccess.Write)) { byte[] buf = new byte[512]; StreamUtils.Copy(stream, fs, buf); } #endregion } } } }