private void FirstConnectSync() //채티방 처음 입장 시 업로드, 다운로드, 삭제 동기화 함수 { while (true) { int firstSyncErr = 0; cnt = 0; try { DirectoryInfo directoryInfo = new DirectoryInfo(cloudDirPath); ////////////////////////파일 목록 전송 시작//////////////////////// JsonObjectCollection jsonObject = new JsonObjectCollection(); JsonObjectCollection filesObject = new JsonObjectCollection("files"); jsonObject.Add(new JsonStringValue("userId", UserInfo.userId)); jsonObject.Add(new JsonStringValue("roomId", roomId)); foreach (var file in directoryInfo.GetFiles()) { fileLastWriteTime = file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); fileLength = file.Length.ToString(); if (file.Name.Equals("Thumbs.db") || Regex.IsMatch(file.Extension, @"\.db", RegexOptions.IgnoreCase)) { Debug.WriteLine("<Chat_Form> .db OR Thumbs.db"); } else { JsonObjectCollection filesInfoObject = new JsonObjectCollection(cnt.ToString()); filesInfoObject.Add(new JsonStringValue("fileName", file.Name)); filesInfoObject.Add(new JsonStringValue("fileExtension", file.Extension)); filesInfoObject.Add(new JsonStringValue("fileLastWriteTime", fileLastWriteTime)); filesInfoObject.Add(new JsonStringValue("fileLength", fileLength)); filesObject.Add(filesInfoObject); cnt++; } } jsonObject.Add(new JsonStringValue("length", cnt.ToString())); jsonObject.Add(filesObject); jsonString = jsonObject.ToString(); JsonSend jsonSend = new JsonSend(); jsonResult = jsonSend.JsonSendToServer(jsonString, 1); Debug.WriteLine("<Chat_Form> upload json send : " + jsonString); Debug.WriteLine("<Chat_Form> upload json Result : " + jsonResult); ////////////////////////파일 목록 전송 완료//////////////////////// ////////////////////////서버에 없는 파일 전송 시작//////////////////////// JObject jObject = JObject.Parse(jsonResult); NameValueCollection updateFileList = new NameValueCollection(); jsonLength = jObject["uploadSize"].ToString(); fileListLength = Convert.ToInt32(jsonLength); jsonDownloadLength = jObject["downloadSize"].ToString(); jsonDeleteLength = jObject["deleteListSize"].ToString(); downloadListLength = Convert.ToInt32(jsonDownloadLength); deleteListLength = Convert.ToInt32(jsonDeleteLength); ////////////////////////삭제 파일 리스트 로컬에서 삭제//////////////////// if (deleteListLength > 0) { NameValueCollection deleteFileList = new NameValueCollection(); for (int i = 0; i < deleteListLength; i++) { updateFileList.Add(Convert.ToString(i), jObject["deleteList"][i].ToString()); } while (true) { try { for (int i = 0; i < deleteListLength; i++) { File.Delete(cloudDirPath + updateFileList[i]); } Debug.WriteLine("파일 삭제 리스트 삭제 완료"); deleteErrCnt = 0; break; } catch (Exception ex) { deleteErrCnt++; Debug.WriteLine("파일 삭제 리스트 삭제 오류 : " + ex); if (deleteErrCnt == 5) { deleteErrCnt = 0; Debug.WriteLine("deleteErrCnt==5"); break; } throw; } } } ////////////////////////삭제 파일 리스트 로컬에서 삭제 완료//////////////////// ////////////////////////서버에 없는 파일 전송 시작//////////////////// for (int i = 0; i < fileListLength; i++) { updateFileList.Add(Convert.ToString(i), jObject["uploadList"][i].ToString()); } for (int i = 0; i < fileListLength; i++) { updateFileName = cloudDirPath + updateFileList[i]; string eachFileName = updateFileList[i]; Debug.WriteLine("<Chat_Form> updateFileName : " + updateFileName); fileInfo = new FileInfo(updateFileName); fileExtension = Path.GetExtension(updateFileName); if (Regex.IsMatch(fileExtension, @"\.lnk", RegexOptions.IgnoreCase)) { MessageBox.Show(".lnk 파일은 동기화 할 수 없습니다."); } else if (Regex.IsMatch(fileExtension, @"\.tmp", RegexOptions.IgnoreCase) || fileInfo.Name.Contains("~$")) { Debug.WriteLine("<Chat_Form> 임시파일 전송 불가 : " + fileInfo.Name); } else if (fileInfo.Name.Contains("~$") && Regex.IsMatch(fileExtension, @"\.Cell", RegexOptions.IgnoreCase)) { Debug.WriteLine("<Chat_Form> 임시파일 전송 불가 : " + fileInfo.Name); } else if (fileInfo.Name.Contains("~$")) { Debug.WriteLine("<Chat_Form> 임시파일 전송 불가 : " + fileInfo.Name); } else { while (true) { try { fileLastWriteTime = fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); length = fileInfo.Length; fileName = fileInfo.Name; fileStream = File.Open(updateFileName, FileMode.Open, FileAccess.Read); fileStream.Close(); break; } catch (Exception ex) { if (openFileErr == 5) { Debug.WriteLine("openFileErr == 5"); break; } else if (ex.ToString().Contains("System.IO.FileNotFoundException")) { Debug.WriteLine("파일을 찾을 수 없습니다."); break; } Debug.WriteLine("열려 있는 파일을 닫아야합니다."); openFileErr++; Thread.Sleep(2000); } } Watcher.SendFileUpload(updateFileName, fileLastWriteTime, length, fileName, fileExtension); simpleData.runThread(0, eachFileName); // 파일 다운로드 소켓 명령 } } Debug.WriteLine("-------------<Chat_Form> 파일 전송 완료----------------"); ////////////////////////서버에 없는 파일 전송 완료//////////////////////// ////////////////////////서버에 있고 공유 폴더에 없는 파일 목록 전송 시작//////////////////////// if (downloadListLength > 0) { JsonObjectCollection jsonDownloadObject = new JsonObjectCollection(); JsonArrayCollection jsonArrayCollection = new JsonArrayCollection("uploadList"); jsonDownloadObject.Add(new JsonStringValue("userId", UserInfo.userId)); jsonDownloadObject.Add(new JsonStringValue("roomId", roomId)); for (int i = 0; i < downloadListLength; i++) { jsonArrayCollection.Add(new JsonStringValue(null, jObject["downloadList"][i].ToString())); } jsonDownloadObject.Add(jsonArrayCollection); jsonString = jsonDownloadObject.ToString(); jsonResult = jsonSend.JsonSendToServer(jsonString, 2); Debug.WriteLine("<Chat_Form> download json send : " + jsonString); Debug.WriteLine("<Chat_Form> download json response : " + jsonResult); ////////////////////////서버로부터 zip파일 전송 받기 시작//////////////////////// if (jsonResult.Equals("created zip file")) { ZipFileDownload(); } ////////////////////////서버로부터 zip파일 전송 받기 완료//////////////////////// } break; } catch (Exception ex) { firstSyncErr++; Debug.WriteLine("FirstSync Err : " + ex); Thread.Sleep(2000); if (firstSyncErr == 5) { Debug.WriteLine("firstSyncErr==5"); break; } } break; } }
// 감시 폴더 내부 변경 event private void Watcher_Created(object sender, FileSystemEventArgs e) { fileLocation = e.FullPath; fileInfo = new FileInfo(fileLocation); string createdFileExtension = Path.GetExtension(fileLocation); if (Regex.IsMatch(createdFileExtension, @"\.lnk", RegexOptions.IgnoreCase)) { MessageBox.Show(".lnk 파일은 동기화 할 수 없습니다."); } else if (Regex.IsMatch(createdFileExtension, @"\.tmp", RegexOptions.IgnoreCase)) { Debug.WriteLine("<Watcher> 임시파일 생성 : " + fileInfo.Name); } else if (fileInfo.Name.Contains("~$") && Regex.IsMatch(createdFileExtension, @"\.Cell", RegexOptions.IgnoreCase)) { Debug.WriteLine("<Watcher> 임시파일 생성 : " + fileInfo.Name); } else if (fileInfo.Name.Contains("~$")) { Debug.WriteLine("<Watcher> 임시파일 생성 : " + fileInfo.Name); } else if (createdFileExtension.Equals("")) { Debug.WriteLine("<Watcher> 임시파일 생성 : " + fileInfo.Name); } else if (Regex.IsMatch(createdFileExtension, @"\.db", RegexOptions.IgnoreCase)) { Debug.WriteLine("<Watcher> .db 파일 생성 : " + fileInfo.Name); } else if (fileInfo.Name.Equals("Thumbs.db")) { Debug.WriteLine("<Watcher> 임시파일 생성 : " + fileInfo.Name); } else { int cnt = 0; while (true) { try { fileLastWriteTime = fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); fileLength = fileInfo.Length; fileName = fileInfo.Name; fileStream = File.Open(fileLocation, FileMode.Open, FileAccess.Read); fileStream.Close(); fileOpen = false; break; } catch (Exception ex) { cnt++; if (ex.ToString().Contains("System.IO.FileNotFoundException")) { Debug.WriteLine("파일을 찾을 수 없습니다."); break; } Debug.WriteLine("Watcher Created Upload Error : " + ex); Thread.Sleep(3000); fileOpen = true; if (cnt == 5) { Debug.WriteLine("Watcher Created Upload Error CNT==5"); break; } } } if (fileOpen == false) { JsonObjectCollection jsonObject = new JsonObjectCollection(); jsonObject.Add(new JsonStringValue("roomId", roomId)); jsonObject.Add(new JsonStringValue("fileName", fileName)); jsonObject.Add(new JsonStringValue("fileLastWriteTime", fileLastWriteTime)); jsonString = jsonObject.ToString(); JsonSend jsonSend = new JsonSend(); jsonResult = jsonSend.JsonSendToServer(jsonString, 4); if (jsonResult == null) { Debug.WriteLine("<Watcher> created jsonResult Err NULL : " + jsonResult); } else if (jsonResult.Equals("true")) { Debug.WriteLine("<Watcher> created json send : " + jsonString); Debug.WriteLine("<Watcher>제이슨 서버 존재 유무 판단 created json Result : " + jsonResult); SendFileUpload(fileLocation, fileLastWriteTime, fileLength, fileName, createdFileExtension); Debug.WriteLine("<Watcher> 생성 : " + fileName); simpleData.runThread(0, fileName); //chat_Form.sendSocket("[파일 다운로드 명령]/" + fileName+"/"); System.Timers.Timer timer = new System.Timers.Timer(); ((FileSystemWatcher)sender).Changed -= Watcher_Changed; timer.Interval = 1000; timer.Elapsed += new ElapsedEventHandler(EventTimer); timer.Start(); } else { Debug.WriteLine("<Watcher> created json send : " + jsonString); Debug.WriteLine("<Watcher> created json Result : " + jsonResult); } } } }