65.9K
CodeProject is changing. Read more.
Home

Directory.CreateDirectory() method bug fixed

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.10/5 (4 votes)

Apr 19, 2005

viewsIcon

71431

Fixing System.IO.Directory.CreateDirectory() security bug.

Introduction

CreateDirectory() method of System.IO.Directory class has some security bug. If account running the code has no read permissions in the root directory, System.IO.Directory.CreateDirectory() method will fail. And you will get such error:

Could not find a part of the path "<full directory path>"

It is because System.IO.Directory.CreateDirectory() checks folder existence from root to lowest folder. The code provided in this article performs the scan in the reverse way - from lowest to upper. Therefore, it won't fail unless it will get to some folder with no read permissions.

Using the code

To use the provided code, add Microsoft Scripting Runtime COM object to your project references.

public static void CreateDirectory(string DirectoryPath)
{
    // trim leading \ character
    DirectoryPath = DirectoryPath.TrimEnd(Path.DirectorySeparatorChar);
    Scripting.FileSystemObject fso = new Scripting.FileSystemObjectClass();
    // check if folder exists, if yes - no work to do
    if(!fso.FolderExists(DirectoryPath))
    {
        int i = DirectoryPath.LastIndexOf(Path.DirectorySeparatorChar);
        // find last\lowest folder name
        string CurrentDirectoryName = DirectoryPath.Substring(i+1, 
                                        DirectoryPath.Length-i-1);
        // find parent folder of the last folder
        string ParentDirectoryPath = DirectoryPath.Substring(0,i);
        // recursive calling of function to create all parent folders 
        CreateDirectory(ParentDirectoryPath);
        // create last folder in current path
        Scripting.Folder folder = fso.GetFolder(ParentDirectoryPath);
        folder.SubFolders.Add(CurrentDirectoryName);
    }
}