internal Task <BoolWithMessage> ImportMapAsync()
        {
            Task <BoolWithMessage> task = Task.Factory.StartNew(() =>
            {
                List <string> filesCopied;
                IProgress <double> progress = new Progress <double>(percent => this.ImportProgress = percent * 100);

                if (IsZipFileImport)
                {
                    // extract compressed file to correct location
                    if (File.Exists(PathToFileOrFolder) == false)
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not exist."));
                    }

                    if (!FileUtils.CompressedFileHasFile(PathToFileOrFolder, ".umap", FileUtils.SearchType.EndsWith))
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not contain a valid .umap file to import."));
                    }

                    this.ImportProgress = 0;

                    try
                    {
                        if (FileUtils.CompressedFileHasFile(PathToFileOrFolder, "Content/", FileUtils.SearchType.StartsWith) || FileUtils.CompressedFileHasFile(PathToFileOrFolder, "Content\\", FileUtils.SearchType.StartsWith))
                        {
                            // extract files to SessionGame/ instead if the zipped up root folder is 'Content/'
                            filesCopied = FileUtils.ExtractCompressedFile(PathToFileOrFolder, SessionPath.ToSessionGame, progress);
                        }
                        else
                        {
                            filesCopied = FileUtils.ExtractCompressedFile(PathToFileOrFolder, SessionPath.ToContent, progress);
                        }

                        string relativePathData = Path.Combine("Content", "Data");

                        if (filesCopied.Any(f => f.Contains(relativePathData)))
                        {
                            Logger.Info("Checking for files extracted to Data folder ...");
                            for (int i = filesCopied.Count - 1; i >= 0; i--)
                            {
                                if (filesCopied[i].Contains(relativePathData) && File.Exists(filesCopied[i]))
                                {
                                    File.Delete(filesCopied[i]);
                                    filesCopied.RemoveAt(i);
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e, "failed to extract file");
                        UserMessage = $"Failed to extract file: {e.Message}";
                        return(BoolWithMessage.False($"Failed to extract: {e.Message}."));
                    }
                }
                else
                {
                    // validate folder exists and contains a valid map file
                    if (Directory.Exists(PathToFileOrFolder) == false)
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not exist."));
                    }

                    if (!MetaDataManager.DoesValidMapExistInFolder(PathToFileOrFolder))
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not contain a valid .umap file to import."));
                    }

                    filesCopied = FileUtils.CopyDirectoryRecursively(PathToFileOrFolder, SessionPath.ToContent, filesToExclude: FilesToExclude, foldersToExclude: StockFoldersToExclude, doContainsSearch: false, progress);
                }


                // create meta data for new map and save to disk
                MapMetaData metaData = GenerateMetaData(filesCopied);
                MetaDataManager.SaveMapMetaData(metaData);

                return(BoolWithMessage.True());
            });

            return(task);
        }
Exemplo n.º 2
0
        internal Task <BoolWithMessage> ImportMapAsync()
        {
            Task <BoolWithMessage> task = Task.Factory.StartNew(() =>
            {
                string sourceFolderToCopy;

                if (IsZipFileImport)
                {
                    // extract compressed file before copying
                    if (File.Exists(PathToFileOrFolder) == false)
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not exist."));
                    }

                    // extract files first before copying
                    BoolWithMessage didExtract = BoolWithMessage.False("");

                    try
                    {
                        Directory.CreateDirectory(PathToTempUnzipFolder);
                        didExtract = FileUtils.ExtractCompressedFile(PathToFileOrFolder, PathToTempUnzipFolder);
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e, "failed to extract zip");
                        didExtract.Message = e.Message;
                    }


                    if (didExtract.Result == false)
                    {
                        UserMessage = $"Failed to extract file: {didExtract.Message}";
                        return(BoolWithMessage.False($"Failed to extract: {didExtract.Message}."));
                    }

                    sourceFolderToCopy = EnsurePathToMapFilesIsCorrect(PathToTempUnzipFolder);
                }
                else
                {
                    // validate folder exists and contains a valid map file
                    if (Directory.Exists(PathToFileOrFolder) == false)
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not exist."));
                    }

                    sourceFolderToCopy = PathToFileOrFolder;

                    bool hasValidMap = MetaDataManager.DoesValidMapExistInFolder(sourceFolderToCopy);

                    if (hasValidMap == false)
                    {
                        return(BoolWithMessage.False($"{PathToFileOrFolder} does not contain a valid .umap file to import."));
                    }
                }

                // create meta data for new map and save to disk
                MapMetaData metaData = MetaDataManager.CreateMapMetaData(sourceFolderToCopy, true);

                if (AssetToImport != null)
                {
                    metaData.AssetName = AssetToImport.ID;
                }

                if (IsZipFileImport == false && metaData != null)
                {
                    metaData.OriginalImportPath = sourceFolderToCopy;
                }

                MetaDataManager.SaveMapMetaData(metaData);

                // copy/move files
                if (IsZipFileImport)
                {
                    FileUtils.MoveDirectoryRecursively(sourceFolderToCopy, SessionPath.ToContent, filesToExclude: FilesToExclude, foldersToExclude: AllStockFoldersToExclude, doContainsSearch: false);
                }
                else
                {
                    FileUtils.CopyDirectoryRecursively(sourceFolderToCopy, SessionPath.ToContent, filesToExclude: FilesToExclude, foldersToExclude: AllStockFoldersToExclude, doContainsSearch: false);
                }


                if (IsZipFileImport && Directory.Exists(PathToTempUnzipFolder))
                {
                    // remove unzipped temp files
                    Directory.Delete(PathToTempUnzipFolder, true);
                }

                return(BoolWithMessage.True());
            });

            return(task);
        }