예제 #1
0
        private void CreateFilesInFolder(string folder, int folderDepth)
        {
            // Create files
            for (int fileCounter = 1; fileCounter <= Config.FilesPerFolder; fileCounter++)
            {
                string filePath = FileEx.CombinePath(folder, $"TestFile-{fileCounter}.tmp");
                WriteFile(filePath);
            }

            // Stop recursion
            if (folderDepth == 0)
            {
                return;
            }

            // Recursively create folders
            for (int folderCounter = 1; folderCounter <= Config.FoldersPerFolder; folderCounter++)
            {
                // Create child folder
                string childFolder = FileEx.CombinePath(folder, $"TestFolder-{folderCounter}");
                FileEx.CreateDirectory(childFolder);

                // Recursively create files and folders
                CreateFilesInFolder(childFolder, folderDepth - 1);
            }
        }
예제 #2
0
    // Tools can override the default behavior as needed
    public virtual bool Update(string updateFile)
    {
        // Make sure the tool folder exists and is empty
        string toolPath = GetToolFolder();

        if (!FileEx.CreateDirectory(toolPath) ||
            !FileEx.DeleteInsideDirectory(toolPath))
        {
            return(false);
        }

        // Extract the update file
        Log.Logger.Information("Extracting {UpdateFile} ...", updateFile);
        return(Tools.SevenZip.UnZip(updateFile, toolPath));
    }
예제 #3
0
    public bool BootstrapDownload()
    {
        // Only supported on Windows
        if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            return(false);
        }

        // Make sure that the Tools folder exists
        if (!Directory.Exists(Tools.GetToolsRoot()))
        {
            Log.Logger.Warning("Creating missing Tools folder : \"{ToolsRoot}\"", Tools.GetToolsRoot());
            if (!FileEx.CreateDirectory(Tools.GetToolsRoot()))
            {
                return(false);
            }
        }

        // Download 7zr.exe in the tools root folder
        // https://www.7-zip.org/a/7zr.exe
        Log.Logger.Information("Downloading \"7zr.exe\" ...");
        string       sevenZr    = Tools.CombineToolPath("7zr.exe");
        const string sevenZrUrl = "https://www.7-zip.org/a/7zr.exe";

        if (!Download.DownloadFile(new Uri(sevenZrUrl), sevenZr))
        {
            return(false);
        }

        // Get the latest version of 7z
        if (!GetLatestVersionWindows(out MediaToolInfo mediaToolInfo))
        {
            return(false);
        }

        // Download the lastest version in the tools root folder
        Log.Logger.Information("Downloading \"{FileName}\" ...", mediaToolInfo.FileName);
        string updateFile = Tools.CombineToolPath(mediaToolInfo.FileName);

        if (!Download.DownloadFile(new Uri(mediaToolInfo.Url), updateFile))
        {
            return(false);
        }

        // Follow the pattern from Update()

        // Use 7zr.exe to extract the archive to the tools folder
        Log.Logger.Information("Extracting {UpdateFile} ...", updateFile);
        string extractPath = Tools.CombineToolPath(Path.GetFileNameWithoutExtension(updateFile));
        string commandline = $"x -aoa -spe -y \"{updateFile}\" -o\"{extractPath}\"";
        int    exitCode    = ProcessEx.Execute(sevenZr, commandline);

        if (exitCode != 0)
        {
            Log.Logger.Error("Failed to extract archive : ExitCode: {ExitCode}", exitCode);
            return(false);
        }

        // Delete the tool destination directory
        string toolPath = GetToolFolder();

        if (!FileEx.DeleteDirectory(toolPath, true))
        {
            return(false);
        }

        // Rename the folder
        // E.g. 7z1805-extra to .\Tools\7Zip
        return(FileEx.RenameFolder(extractPath, toolPath));
    }
예제 #4
0
        public int Run()
        {
            // Result file
            FileIterationResultFile resultFile = new FileIterationResultFile(Config.ResultFile);

            ConsoleEx.WriteLine($"Writing results to : \"{resultFile.FileName}\"");
            resultFile.WriteHeader();
            ConsoleEx.WriteLine("");

            // Run the test for each of the target folders
            int result = 0;

            foreach (string target in Config.Targets)
            {
                // Clear target directory
                ConsoleEx.WriteLine($"Starting CreateTest for \"{target}\"");
                if (!FileEx.CreateDirectory(target) ||
                    !FileEx.DeleteInsideDirectory(target))
                {
                    resultFile.AddFailedResult(Config, target);
                    ConsoleEx.WriteLineError($"Failed to create or clear target \"{target}\"");
                    ConsoleEx.WriteLine("");

                    // Next target
                    result = -1;
                    continue;
                }

                // Recursively create files and folders
                Stopwatch timer = new Stopwatch();
                timer.Start();
                CreateFilesInFolder(target, Config.FolderDepth);
                timer.Stop();
                TimeSpan createTime = timer.Elapsed;
                ConsoleEx.WriteLine($"CreateTest Time : {createTime}");
                ConsoleEx.WriteLine("");

                // Recursively read files and folders
                ConsoleEx.WriteLine($"Starting ReadTest for \"{target}\"");
                timer.Restart();
                ReadFilesInFolder(target, out int folderCount, out int fileCount);
                timer.Stop();
                TimeSpan readTime = timer.Elapsed;
                ConsoleEx.WriteLine($"ReadTest Time : {readTime}, Folder Count : {folderCount}, File Count : {fileCount}");
                ConsoleEx.WriteLine("");

                // Clear target directory
                ConsoleEx.WriteLine($"Starting DeleteTest for \"{target}\"");
                timer.Restart();
                FileEx.DeleteInsideDirectory(target);
                timer.Stop();
                TimeSpan deleteTime = timer.Elapsed;
                ConsoleEx.WriteLine($"DeleteTest Time : {deleteTime}");
                ConsoleEx.WriteLine("");

                // Write result
                resultFile.AddResult(Config, target, folderCount, fileCount, createTime, readTime, deleteTime);
            }

            return(result);
        }