//ファイルを使用中リストに
		void MoveToUseList(AssetFileWork work)
		{
			if (!usingFileList.Contains(work))
			{
				usingFileList.Add(work);
			}
			if (unuesdFileList.Contains(work))
			{
				unuesdFileList.Remove(work);
			}
			RefleshMemSize();
		}
		//ロード終了チェック
		bool IsLoadEnd( AssetFileWork.LoadPriority priority )
		{
			foreach (var file in loadingFileList)
			{
				if( file.Priority <= priority )
				{
					if (!file.IsLoadEnd) return false;
				}
			}
			foreach (var file in loadWaitFileList)
			{
				if (file.Priority <= priority)
				{
					if (!file.IsLoadEnd) return false;
				}
			}
			return true;
		}
		//ファイルリロード
		void ReloadFileSub(AssetFileWork file)
		{
			StartCoroutine(CoLoadFile(file));
		}
		//キャッシュファイル書き込み
		void WriteNewVersion(AssetFileWork file)
		{
			//キャッシュファイル書き込み準備
			file.FileInfo.ReadyToWriteCache(fileInfoTbl.IncCacheID(), GetCacheRootDir(), isDebugCacheFileName);
			string cachePath = file.FileInfo.CachePath;

			//キャッシュ用のディレクトリがなければ作成
			FileIOManger.CreateDirectory(cachePath);

			//ファイル書き込み
			bool ret = false;
			if (file.FileInfo.IsCrypt && !file.FileInfo.IsAlreadyEncoded)
			{
				switch (file.FileInfo.FileType)
				{
					case AssetFileType.Sound:
						ret = FileIOManger.WriteSound(cachePath, file.WriteCacheFileSound);
						break;
					case AssetFileType.Texture:
						ret = FileIOManger.WriteEncodeNoCompress(cachePath, file.CacheWriteBytes);
						break;
					default:
						ret = FileIOManger.WriteEncode(cachePath, file.CacheWriteBytes);
						break;
				}
			}
			else
			{
				ret = FileIOManger.Write(cachePath, file.CacheWriteBytes);
			}

			WrapperUnityVersion.SetNoBackupFlag(cachePath);

			//キャッシュファイルテーブルを更新して上書き
			if (!ret)
			{
				DebugLogError("Write Failed :" + file.FileInfo.CachePath);
			}
			else
			{
				WriteCacheTbl();
				file.FileInfo.DeleteOldCacheFile();
			}
		}
		//ファイルロード開始(ファイルロード数が上限を超えていたら失敗)
		bool LoadFile(AssetFileWork file)
		{
			if (loadingFileList.Count < loadFileMax)
			{
				if (loadingFileList.Contains(file))
				{
					Debug.LogError(file.Key + " is already loaded");
				}
				loadingFileList.Add(file);
				DebugLog("Load Start :" + file.FileName + " ver:" + file.FileInfo.Version + " cache:" + file.FileInfo.CacheVersion);
				StartCoroutine(CoLoadFile(file));
				return true;
			}
			else
			{
				return false;
			}
		}
		IEnumerator CoLoadFile(AssetFileWork file)
		{
			yield return StartCoroutine(file.CoLoadAsync(timeOutDownload));

			if (!file.IsLoadError)
			{
				//新たにキャッシュファイル書きこむ必要がある場合
				if (file.FileInfo.IsWriteNewCache && !file.IgnoreLoad )
				{
					//ロード成功
					DebugLog("WriteCacheFile:" + file.FileName + " ver:" + file.FileInfo.Version + " cache:" + file.FileInfo.CacheVersion);
					WriteNewVersion(file);
				}
				//ロード終了処理
				file.LoadComplete();

				//再ロード必要
				if (file.IsLoadRetry)
				{
					StartCoroutine(CoLoadFile(file));
				}
				else
				{
					//ロード成功
					DebugLog("Load End :" + file.FileName + " ver:" + file.FileInfo.Version);
					loadingFileList.Remove(file);
					LoadNextFile();
					MemoryOptimize();
				}
			}
			else
			{
				//ロード失敗
				DebugLogError("Load Failed :" + file.FileName + " ver:" + file.FileInfo.Version + "\n" + file.LoadErrorMsg);

				//リトライ
				if (file.IncLoadErrorRetryCount() < autoRetryCountOnDonwloadError )
				{
					DebugLog("Load Retry :" + file.FileName + " ver:" + file.FileInfo.Version);
					StartCoroutine(CoLoadFile(file));
				}
				else
				{
					if (file.FileInfo.IsCaching )
					{
						//キャシュ削除してもう一度DL
						file.ResetLoadErrorRetryCount();
						DeleteCacheFileSub(file.FileName);
						StartCoroutine(CoLoadFile(file));
					}
					else
					{
						if (null != CallbackError) CallbackError(file);
					}
				}
			}
		}
		//ロード待ちリストを追加
		void AddLoadFile(AssetFileWork file)
		{
			if (!LoadFile(file))
			{
				loadWaitFileList.Add(file);
			}
		}
		//	ファイルのバックグランドロード
		AssetFileWork BackGroundLoadSub(AssetFileWork file, System.Object referenceObj)
		{
			MoveToUseList(file);
			if (file.ReadyToLoad(AssetFileWork.LoadPriority.BackGround, referenceObj))
			{
				RefleshMemSize();
				return file;
			}
			AddLoadFile(file);
			return file;
		}
		// ダウンロード
		void DownloadSub(AssetFileWork file)
		{
			if (file.FileInfo.IsWriteNewCache )
			{
				if (file.ReadyToLoad(AssetFileWork.LoadPriority.DownloadOnly, null))
				{
					RefleshMemSize();
					return;
				}
				AddLoadFile(file);
			}
		}
		// 管理ファイルを追加
		AssetFileWork AddSub(string path)
		{
			AssetFileWork file;
			if (fileTbl.TryGetValue(path, out file))
			{
				//既にマネージャーの管理下にある
				return file;
			}
			else
			{
				file = new AssetFileWork(GetFileInfoCreateIfMissing(path), FileIOManger);
				fileTbl.Add(file);
				string ext = System.IO.Path.GetExtension(path).ToLower();
				file.IgnoreLoad |= Array.Exists(ignoreLoadFileTypes, s => (s == ext));
#if true
				if (file.FileInfo.FileType == AssetFileType.UnityObject
					&& ( (file.FileInfo.StrageType == AssetFileStrageType.Web) || (file.FileInfo.StrageType == AssetFileStrageType.WebNocache)))
				{
					file.IgnoreLoad |= true;
				}
#endif
				return file;
			}
		}
		//ロード中のファイル数
		int CountLoading(AssetFileWork.LoadPriority priority)
		{
			int count = 0;
			foreach (var file in loadingFileList)
			{
				if (file.Priority <= priority)
				{
					if (!file.IsLoadEnd)
					{
						++count;
					}
				}
			}
			foreach (var file in loadWaitFileList)
			{
				if (file.Priority <= priority)
				{
					if (!file.IsLoadEnd)
					{
						++count;
					}
				}
			}
			return count;
		}