/// <summary> /// FTPサーバーから前回データのファイルパスを全て取得する /// </summary> /// <param name="deviceAdress">接続しているデバイスのアドレス(MACアドレス)</param> /// <param name="onGetDataPathList">データのパスリスト取得完了時に呼び出されるコールバック。取得失敗時はnull</param> static IEnumerator GetPriviousDataPathList(string deviceAdress, Action <List <string> > onGetDataPathList) { Debug.Log("GetPriviousDataPathList"); //スリープしないように設定 Screen.sleepTimeout = SleepTimeout.NeverSleep; bool isConnectComplete = false; bool isConnectSuccess = false; FtpManager.Connection((bool isSuccess) => { isConnectSuccess = isSuccess; isConnectComplete = true; }); yield return(new WaitUntil(() => isConnectComplete)); if (!isConnectSuccess) { //接続失敗 Debug.Log("Connection Failed..."); onGetDataPathList(null); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } Debug.Log("Connection Success"); //GetListingではサブディレクトリまで取得する事ができないためCSVファイル取得するのに2回に分けてアクセスする必要がある。 var firstPath = "/Data/" + deviceAdress; var isDirectoryGetListingSuccess = false; var isDirectoryGetListingComplete = false; List <List <string> > getDirectoryList = new List <List <string> > (); Debug.Log("GetDirectoryFilePath:" + firstPath); FtpManager.ManualGetListing(firstPath, (bool _isSuccess, List <List <string> > _getPathList) => { isDirectoryGetListingSuccess = _isSuccess; getDirectoryList = _getPathList; isDirectoryGetListingComplete = true; }); yield return(new WaitUntil(() => isDirectoryGetListingComplete)); if (!isDirectoryGetListingSuccess) { //取得失敗 Debug.Log("DirectoryGetListingFailed..."); onGetDataPathList(null); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } Debug.Log("DirectoryGetListingSuccess"); //確認用 List <string> correctDirectoryFullPathList = new List <string> (); foreach (List <string> directoryInfo in getDirectoryList) { //取得したものにファイル、Linkが混じってる可能性があるためディレクトリのみにする if (int.Parse(directoryInfo [0]) == 1) //タイプがディレクトリなら { correctDirectoryFullPathList.Add(directoryInfo [2]); //フルパスを追加 Debug.Log(directoryInfo [2] + " is directory"); } } //取得したディレクトリから、その中のCSVファイルを取得しにいく。 List <string> correctFileFullPathList = new List <string> (); foreach (string directoryFullPath in correctDirectoryFullPathList) { Debug.Log("GetFilesIn:" + directoryFullPath); var isFileGetListingSuccess = false; var isFileGetListingComplete = false; var getFileList = new List <List <string> > (); FtpManager.ManualGetListing(directoryFullPath, (bool _isSuccess, List <List <string> > _getPathList) => { isFileGetListingSuccess = _isSuccess; getFileList = _getPathList; isFileGetListingComplete = true; }); yield return(new WaitUntil(() => isFileGetListingComplete)); if (!isFileGetListingSuccess) { //取得失敗 Debug.Log("FileGetFailed:" + directoryFullPath); onGetDataPathList(null); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } Debug.Log("File Count is " + getFileList.Count); foreach (List <string> fileInfo in getFileList) { //取得したものにディレクトリ、Linkが混じってる可能性があるためファイルのみにする if (int.Parse(fileInfo [0]) == 0) //タイプがファイルなら { correctFileFullPathList.Add(fileInfo [2]); //フルパスを追加 Debug.Log(fileInfo [2] + " is file"); } } } //指定したパス以下のすべてのファイルが取得できたため、切断 bool isDisConnectComplete = false; bool isDisConnectSuccess = false; FtpManager.DisConnect((bool isSuccess) => { isDisConnectSuccess = isSuccess; isDisConnectComplete = true; }); yield return(new WaitUntil(() => isDisConnectComplete)); if (!isDisConnectSuccess) { //切断失敗 Debug.Log("Disconnect Failed..."); onGetDataPathList(null); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } //確認用 foreach (string resultPath in correctFileFullPathList) { Debug.Log(resultPath); } onGetDataPathList(correctFileFullPathList); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; }
//サーバーに未アップロードのCsvファイルをFTPでアップロードする public static IEnumerator UploadUnsendDatas() { var dataPath = Kaimin.Common.Utility.GsDataPath(); var sleepTable = MyDatabase.Instance.GetSleepTable(); var sleepDatas = sleepTable.SelectAllOrderByAsc(); //DBに登録されたすべてのデータ var unSentDatas = sleepDatas.Where(data => data.send_flag == false).ToList(); //サーバーに送信してないすべてのデータ //データが0件ならアップロードを行わない if (unSentDatas.Count == 0) { yield break; } UpdateDialog.Show("同期中"); Screen.sleepTimeout = SleepTimeout.NeverSleep; //スリープしないように設定 Debug.Log("UploadUnsendDatas_unsentDataCount:" + unSentDatas.Count); var mulitipleUploadDataCount = 10; //一回でまとめてアップロードするデータ件数 List <DbSleepData> sendDataStock = new List <DbSleepData>(); //アップロードするデータを貯めておくリスト //ファイルアップロードのためにサーバーと接続 bool isConnectionSuccess = false; bool isConnectionComplete = false; FtpManager.Connection((bool _success) => { isConnectionSuccess = _success; isConnectionComplete = true; }); yield return(new WaitUntil(() => isConnectionComplete)); if (!isConnectionSuccess) { //サーバーとの接続に失敗すれば UpdateDialog.Dismiss(); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } //サーバーに送信してないデータをアップロード for (int i = 0; i < unSentDatas.Count; i++) { var data = unSentDatas[i]; var uploadPath = data.file_path; //例:1122334455566/yyyyMM/20180827092055.csv uploadPath = uploadPath.Substring(0, uploadPath.LastIndexOf('/') + 1); //例:1122334455566/yyyyMM/ uploadPath = "/Data/" + uploadPath; //例:/Data/1122334455566/yyyyMM/ Debug.Log("data.date:" + data.date + "; data.file_path:" + data.file_path + "; fullPath:" + dataPath + data.file_path); //アップロードするデータが正常か確認する if (System.IO.File.Exists(dataPath + data.file_path)) { sendDataStock.Add(data); } else { //ファイルが存在してなければ、DBから削除する sleepTable.DeleteFromTable(SleepTable.COL_DATE, data.date); } bool isStockDataCount = sendDataStock.Count >= mulitipleUploadDataCount; //送信するデータ個数が一定量(multipleUploadDataCount)に達したかどうか bool isLastData = i >= unSentDatas.Count - 1; //最後のデータかどうか bool isSameDirectoryNextData = false; //現在データと次データのアップロード先が同じであるか if (!isLastData) { //最後のデータでなければ、次のデータが同じディレクトリのデータであるか確認する。 //現在データと比較できるように次データのパスを同じように変換 var nextDataDirectory = unSentDatas[i + 1].file_path; //例:1122334455566/yyyyMM/20180827092055.csv nextDataDirectory = nextDataDirectory.Substring(0, nextDataDirectory.LastIndexOf('/') + 1); //例:1122334455566/yyyyMM/ nextDataDirectory = "/Data/" + nextDataDirectory; //例:/Data/1122334455566/yyyyMM/ //現在データと次データのアップロード先パスを比較 isSameDirectoryNextData = uploadPath == nextDataDirectory; } Debug.Log("isStockDataCount:" + isStockDataCount + ",isLastData:" + isLastData + ",isSameDirectoryNextData:" + isSameDirectoryNextData); if (isStockDataCount || isLastData || !isSameDirectoryNextData) { Debug.Log("UploadData"); //まとめて送信するデータ件数に達したか、最後のデータに到達したらアップロードを行う //確認 foreach (var stockedData in sendDataStock) { Debug.Log("stockData_path:" + stockedData.file_path); } var uploadTask = FtpManager.ManualMulitipleUploadFileAsync(sendDataStock.Select(d => (dataPath + d.file_path)).ToList(), uploadPath); yield return(uploadTask.AsCoroutine()); Debug.Log(uploadTask.Result); //アップロードに成功すれば、アップロードしたファイルのDB送信フラグをtrueに if (uploadTask.Result) { for (int j = 0; j < sendDataStock.Count; j++) { var dateString = sendDataStock.Select(d => d.date).ToList()[j]; //例:20180827092055.csv var filePath = sendDataStock.Select(d => d.file_path).ToList()[j]; //例:1122334455566/yyyyMM/20180827092055.csv sleepTable.Update(new DbSleepData(dateString, filePath, true)); Debug.Log("Uploaded."); sleepTable.DebugPrint(); } //データのアップロードがひとまとまり完了すれば、次のデータのアップロードへ移る sendDataStock = new List <DbSleepData>(); } else { //アップロードに失敗すれば UpdateDialog.Dismiss(); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; yield break; } } } Debug.Log("Upload end"); //サーバーとの接続を切る FtpManager.DisConnect(); UpdateDialog.Dismiss(); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; }
/// <summary> /// サーバーに存在する指定のパスのファイルを取得して、DBに登録する /// </summary> /// <returns>The server datas to regist D.</returns> /// <param name="mono">Mono.</param> /// <param name="filePathList">File path list.</param> /// <param name="restoreCount">(復元再開時に使用)復元済みのデータ件数</param> static IEnumerator DownloadServerDatasToRegistDB(MonoBehaviour mono, List <string> filePathList, int restoreCount = 0) { Debug.Log("DownloadServerDatasToRegistDB"); //スリープしないようにする Screen.sleepTimeout = SleepTimeout.NeverSleep; //指定されたファイルパスとDBとを照合してDBに未登録のデータを探し出す List <string> noDBRegistDataList = GetNoDBRegistDataList(filePathList); //ファイルのディレクトリによってリストを分割する List <List <string> > downloadDataListDivideDirectory = DivideDataListByDirectory(noDBRegistDataList); var sleepTable = MyDatabase.Instance.GetSleepTable(); //進捗ダイアログ表示 ProgressDialog.Show("データを復元しています。", noDBRegistDataList.Count + restoreCount, restoreCount); int downloadCompleteDataSum = restoreCount; //ダウンロード完了したデータ件数 //int multipleDownLoadDataCount = 5; //一回でまとめてダウンロードする最大件数 int multipleDownLoadDataCount = 1; //一回でまとめてダウンロードする最大件数 //ファイルアップロードのためにサーバーと接続 bool isConnectionSuccess = false; bool isConnectionComplete = false; FtpManager.Connection((bool _success) => { isConnectionSuccess = _success; isConnectionComplete = true; }); yield return(new WaitUntil(() => isConnectionComplete)); if (!isConnectionSuccess) { //サーバーとの接続に失敗すれば //ダウンロードに失敗したら //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; //進捗ダイアログ終了 ProgressDialog.Dismiss(); //復元に失敗した事をユーザーに伝える yield return(mono.StartCoroutine(TellFailedRestoreData())); #if UNITY_ANDROID bool isShutDownApp = false; yield return(mono.StartCoroutine(AskShutDownApp((bool _isShutDownApp) => isShutDownApp = _isShutDownApp))); if (isShutDownApp) { //アプリを終了 Application.Quit(); } else { //終了しないなら、復元処理を再度行う yield return(mono.StartCoroutine(DownloadServerDatasToRegistDB(mono, filePathList, downloadCompleteDataSum))); } #elif UNITY_IOS //iOSの場合は、アプリの終了が行えないため確認はせずに再接続する yield return(mono.StartCoroutine(DownloadServerDatasToRegistDB(mono, filePathList, downloadCompleteDataSum))); #endif yield break; } //ディレクトリごとに区切ってダウンロードを行う foreach (List <string> downloadDataListInDirectory in downloadDataListDivideDirectory) { //1つのディレクトリに存在するデータリストを一回でダウンロードする最大件数で更に区切って小分けにダウンロードを行う for (int i = 0; i < Mathf.CeilToInt((float)downloadDataListInDirectory.Count / (float)multipleDownLoadDataCount); i++) { int dataCount = (downloadDataListInDirectory.Count - (multipleDownLoadDataCount * i)) >= multipleDownLoadDataCount ? multipleDownLoadDataCount : downloadDataListInDirectory.Count % multipleDownLoadDataCount; List <string> downloadDataList = downloadDataListInDirectory.Skip(i * multipleDownLoadDataCount).Take(dataCount).ToList(); //保存先のパス(Android端末内) var filePath = downloadDataList.First(); var dataDirectoryPath = filePath.Substring(filePath.IndexOf('/') + 1); if (dataDirectoryPath.Contains("Data")) //パスの形式が先頭にスラッシュがついてるかついてないか心配なので、一応 { dataDirectoryPath = dataDirectoryPath.Substring(dataDirectoryPath.IndexOf('/') + 1); } dataDirectoryPath = dataDirectoryPath.Substring(0, dataDirectoryPath.LastIndexOf('/') + 1); //例:/112233445566/yyyyMMdd/ if (dataDirectoryPath.Contains("csv")) //念のため { dataDirectoryPath = dataDirectoryPath.Substring(0, dataDirectoryPath.LastIndexOf('/') + 1); } //先頭にスラッシュがついてれば、削除する if (dataDirectoryPath.IndexOf('/') == 0) { dataDirectoryPath = dataDirectoryPath.Substring(1); } var fullDataDirectoryPath = Kaimin.Common.Utility.GsDataPath() + dataDirectoryPath; Debug.Log("fullDataDirectoryPath:" + fullDataDirectoryPath); var downloadTask = FtpManager.ManualSingleDownloadFileAsync(fullDataDirectoryPath + Path.GetFileName(downloadDataList[0]), downloadDataList[0], null); yield return(downloadTask.AsCoroutine()); //ダウンロードに成功すれば、ダウンロードしたデータをDBに登録する Debug.Log("DataDownload:" + downloadTask.Result); if (downloadTask.Result) { //foreach (string downloadData in downloadDataList) { var date = downloadDataList[0]; //例:/Data/112233445566/yyyyMMdd/20180827092055.csv date = date.Substring(date.LastIndexOf('/') + 1); //例:20180827092055.csv date = date.Substring(0, date.LastIndexOf('.')); //例:20180827092055 var dataPath = dataDirectoryPath + date + ".csv"; sleepTable.Update(new DbSleepData(date, dataPath, true)); Debug.Log("Insert " + dataPath + " to DB."); //データが正常に保存されているか確認する Debug.Log("isExistFile:" + System.IO.File.Exists(Kaimin.Common.Utility.GsDataPath() + dataPath)); //進捗ダイアログ更新 downloadCompleteDataSum++; //復元した件数を記録 UserDataManager.State.SaveRestoreDataCount(downloadCompleteDataSum); ProgressDialog.UpdateProgress(downloadCompleteDataSum); //} Debug.Log("Download Success!"); } else { //ダウンロードに失敗したら //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; //進捗ダイアログ終了 ProgressDialog.Dismiss(); //復元に失敗した事をユーザーに伝える yield return(mono.StartCoroutine(TellFailedRestoreData())); #if UNITY_ANDROID bool isShutDownApp = false; yield return(mono.StartCoroutine(AskShutDownApp((bool _isShutDownApp) => isShutDownApp = _isShutDownApp))); if (isShutDownApp) { //アプリを終了 Application.Quit(); } else { //終了しないなら、復元処理を再度行う yield return(mono.StartCoroutine(DownloadServerDatasToRegistDB(mono, filePathList, downloadCompleteDataSum))); } #elif UNITY_IOS //iOSの場合は、アプリの終了が行えないため確認はせずに再接続する yield return(mono.StartCoroutine(DownloadServerDatasToRegistDB(mono, filePathList, downloadCompleteDataSum))); #endif yield break; } } } //サーバーとの接続を切る FtpManager.DisConnect(); //復元が成功した場合のみここまで到達 Debug.Log("RestoreCompleted!!!!!"); //DB確認 Debug.Log("StartCheckDBData----------------------------"); var dbFilePathList = Kaimin.Common.Utility.GetAllFiles(Kaimin.Common.Utility.GsDataPath(), "*.csv"); foreach (var filePath in dbFilePathList) { Debug.Log("FilePath:" + filePath); } Debug.Log("EndCheckDBData----------------------------"); //スリープ設定解除 Screen.sleepTimeout = SleepTimeout.SystemSetting; //これ以降復元しないように設定 UserDataManager.State.SaveNessesaryRestore(false); //進捗ダイアログ終了 ProgressDialog.Dismiss(); //復元完了した事をユーザーに伝える yield return(mono.StartCoroutine(TellCompleteDataRestore())); }