// NAnt - A .NET build tool // Copyright (C) 2001 Gerry Shaw // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // Gerry Shaw (gerry_shaw@yahoo.com) // Scott Hernandez (ScottHernandez@hotmail.com) using System; using System.IO; using NUnit.Framework; namespace Tests.NAnt.Core.Util { public sealed class TempDir { /// Creates a temporary directory for a unit test. /// /// If the directory already exists it will first be deleted and a new empty directory will be created. /// The complete path to the created directory. public static string Create(string name) { string path = Path.Combine(Path.GetTempPath(), name); if(Path.IsPathRooted(name)) path = name; // delete any existing directory from previously failed test Delete(path); // create the new empty directory Directory.CreateDirectory(path); if (!Directory.Exists(path)) { throw new AssertionException("TempDir: " + path + " does not exists."); } return path; } /// Delete the directory at the given path and everything in it. public static void Delete(string path) { bool bError = false; try { if (Directory.Exists(path)) { // ensure directorty is writable File.SetAttributes(path, FileAttributes.Normal); // ensure all files and subdirectories are writable SetAllFileAttributesToNormal(path); string[] directoryNames = Directory.GetDirectories(path); foreach (string directoryName in directoryNames) { Delete(directoryName); } string[] fileNames = Directory.GetFiles(path); foreach (string fileName in fileNames) { File.Delete(fileName); } Directory.Delete(path, true); } } catch(Exception ex) { bError = true; throw new AssertionException("Unable to cleanup '" + path + "'. " + ex.Message, ex); } finally { if (!bError && Directory.Exists(path)) { throw new AssertionException("TempDir: "+ path + " still exists."); } } } /// /// Recurse over all files in the directory setting each file's attributes /// to . /// private static void SetAllFileAttributesToNormal(string path) { string[] fileNames = Directory.GetFiles(path); foreach (string fileName in fileNames) { File.SetAttributes(fileName, FileAttributes.Normal); } string[] directoryNames = Directory.GetDirectories(path); foreach (string directoryName in directoryNames) { File.SetAttributes(directoryName, FileAttributes.Normal); SetAllFileAttributesToNormal(directoryName); } } } }