// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Diagnostics;
using System.IO;
namespace Microsoft.DotNet.Tools.Test.Utilities
{
public class TempDirectory
{
private readonly string _path;
private readonly TempRoot _root;
protected TempDirectory(TempRoot root)
: this(CreateUniqueDirectory(TempRoot.Root), root)
{
}
private TempDirectory(string path, TempRoot root)
{
Debug.Assert(path != null);
Debug.Assert(root != null);
_path = path;
_root = root;
}
private static string CreateUniqueDirectory(string basePath)
{
while (true)
{
string dir = System.IO.Path.Combine(basePath, Guid.NewGuid().ToString());
try
{
Directory.CreateDirectory(dir);
return dir;
}
catch (IOException)
{
// retry
}
}
}
public string Path
{
get { return _path; }
}
public DirectoryInfo DirectoryInfo => new DirectoryInfo(Path);
///
/// Creates a file in this directory.
///
/// File name.
public TempFile CreateFile(string name)
{
string filePath = System.IO.Path.Combine(_path, name);
TempRoot.CreateStream(filePath);
return _root.AddFile(new DisposableFile(filePath));
}
///
/// Creates a file in this directory that is a copy of the specified file.
///
public TempFile CopyFile(string originalPath)
{
string name = System.IO.Path.GetFileName(originalPath);
string filePath = System.IO.Path.Combine(_path, name);
File.Copy(originalPath, filePath);
return _root.AddFile(new DisposableFile(filePath));
}
///
/// Recursively copy the provided directory into this TempDirectory.
/// Does not handle links.
///
///
///
public TempDirectory CopyDirectory(string sourceDirectory)
{
Debug.Assert(Directory.Exists(sourceDirectory), $"{sourceDirectory} does not exists");
var tempCopy = CreateDirectory(new DirectoryInfo(sourceDirectory).Name);
foreach(var file in Directory.EnumerateFiles(sourceDirectory))
{
tempCopy.CopyFile(file);
}
foreach(var directory in Directory.EnumerateDirectories(sourceDirectory))
{
tempCopy.CopyDirectory(directory);
}
return tempCopy;
}
///
/// Creates a subdirectory in this directory.
///
/// Directory name or unrooted directory path.
public TempDirectory CreateDirectory(string name)
{
string dirPath = System.IO.Path.Combine(_path, name);
Directory.CreateDirectory(dirPath);
return new TempDirectory(dirPath, _root);
}
public void SetCurrentDirectory()
{
Directory.SetCurrentDirectory(_path);
}
public override string ToString()
{
return _path;
}
}
}