Cleanup: replace 'Utils.FileExists()/DirectoryExists()/ItemExists()' with .NET methods (#7129)

This commit is contained in:
Ilya
2018-07-25 10:02:09 -07:00
committed by Dongbo Wang
parent 87d8fc969c
commit e3854815ab
9 changed files with 103 additions and 199 deletions
@@ -204,7 +204,7 @@ namespace Microsoft.PowerShell
string path)
{
string resolvedProviderPath = cmdlet.SessionState.Path.GetUnresolvedProviderPathFromPSPath(path);
if (Utils.FileExists(resolvedProviderPath))
if (File.Exists(resolvedProviderPath))
{
return resolvedProviderPath;
}
@@ -578,7 +578,7 @@ namespace System.Management.Automation
do // false loop
{
if (!Utils.FileExists(path))
if (!File.Exists(path))
{
CommandDiscovery.discoveryTracer.TraceError("The path does not exist: {0}", path);
break;
@@ -691,10 +691,9 @@ namespace System.Management.Automation
var keys = Entries.Keys;
foreach (var key in keys)
{
if (!Utils.FileExists(key))
if (!File.Exists(key))
{
ModuleCacheEntry unused;
removedSomething |= Entries.TryRemove(key, out unused);
removedSomething |= Entries.TryRemove(key, out ModuleCacheEntry _);
}
}
@@ -731,7 +730,7 @@ namespace System.Management.Automation
try
{
if (Utils.FileExists(filename))
if (File.Exists(filename))
{
var fileLastWriteTime = new FileInfo(filename).LastWriteTime;
if (fileLastWriteTime > this.LastReadTime)
@@ -1028,7 +1027,7 @@ namespace System.Management.Automation
{
try
{
if (Utils.FileExists(s_cacheStoreLocation))
if (File.Exists(s_cacheStoreLocation))
{
return Deserialize(s_cacheStoreLocation);
}
@@ -312,7 +312,7 @@ namespace Microsoft.PowerShell.Commands
{
qualifiedPath = Path.Combine(qualifiedPath, fileBaseName);
}
else if (Utils.DirectoryExists(qualifiedPath))
else if (Directory.Exists(qualifiedPath))
{
// if it points to a directory, add the basename back onto the path...
qualifiedPath = Path.Combine(qualifiedPath, Path.GetFileName(fileBaseName));
@@ -921,10 +921,9 @@ namespace Microsoft.PowerShell.Commands
foreach (string resolvedModulePath in modulePathCollection)
{
string moduleName = Path.GetFileName(resolvedModulePath);
bool isDirectory = Utils.DirectoryExists(resolvedModulePath);
// If the given path is a valid module file, we will load the specific file
if (!isDirectory && ModuleIntrinsics.IsPowerShellModuleExtension(Path.GetExtension(moduleName)))
if (!Directory.Exists(resolvedModulePath) && ModuleIntrinsics.IsPowerShellModuleExtension(Path.GetExtension(moduleName)))
{
PSModuleInfo module = CreateModuleInfoForGetModule(resolvedModulePath, refresh);
if (module != null)
@@ -1593,7 +1592,7 @@ namespace Microsoft.PowerShell.Commands
return loadedModule;
}
// remove the module if force is specified (and if module is already loaded)
else if (Utils.FileExists(rootedPath))
else if (File.Exists(rootedPath))
{
RemoveModule(loadedModule);
}
@@ -4360,7 +4359,7 @@ namespace Microsoft.PowerShell.Commands
// which we can't really do b/c the file doesn't exist.
fixedFileName = psHome + "\\" + Path.GetFileName(s);
}
else if (verifyFilesExist && !Utils.FileExists(fixedFileName))
else if (verifyFilesExist && !File.Exists(fixedFileName))
{
string message = StringUtil.Format(SessionStateStrings.PathNotFound, fixedFileName);
throw new FileNotFoundException(message, fixedFileName);
@@ -5084,7 +5083,7 @@ namespace Microsoft.PowerShell.Commands
else // reimport the module + return alreadyLoadedModule (alreadyLoadedModule = no need to proceed with regular import)
{
// If the module has already been loaded, then while loading it the second time, we should load it with the DefaultCommandPrefix specified in the module manifest. (If there is no Prefix from command line)
if (string.IsNullOrEmpty(prefix) && Utils.FileExists(alreadyLoadedModule.Path))
if (string.IsNullOrEmpty(prefix) && File.Exists(alreadyLoadedModule.Path))
{
string defaultPrefix = GetDefaultPrefix(alreadyLoadedModule);
if (!string.IsNullOrEmpty(defaultPrefix))
@@ -5260,7 +5259,7 @@ namespace Microsoft.PowerShell.Commands
found = true;
return module;
}
else if (Utils.FileExists(fileName))
else if (File.Exists(fileName))
{
moduleFileFound = true;
// Win8: 325243 - Added the version check so that we do not unload modules with the same name but different version
@@ -5410,7 +5409,7 @@ namespace Microsoft.PowerShell.Commands
{
Dbg.Assert(fileName != null, "Filename argument to LoadModule() shouldn't be null");
if (!Utils.FileExists(fileName))
if (!File.Exists(fileName))
{
found = false;
moduleFileFound = false;
@@ -963,25 +963,9 @@ namespace System.Management.Automation
if (systemDriveInfo.DriveType == DriveType.NoRootDirectory)
{
try
{
// Checking for the presence of mounted drive locally using Utils.DirectoryExists API as
// the calls to this API is faster than normal Directory.Exist API.
bool validDrive = Utils.DirectoryExists(drive.Root);
if (!validDrive)
{
result = true;
}
}
// We don't want to have automounting cause an exception. We
// rather it just fail silently as it wasn't a result of an
// explicit request by the user anyway.
// Following the same pattern as the Calling API.
catch (IOException)
{
}
catch (UnauthorizedAccessException)
if (!Directory.Exists(drive.Root))
{
result = true;
}
}
}
@@ -908,61 +908,6 @@ namespace System.Management.Automation
#endif
}
internal static bool ItemExists(string path)
{
try
{
return ItemExists(path, out bool _);
}
catch
{
}
return false;
}
internal static bool ItemExists(string path, out bool isDirectory)
{
isDirectory = false;
if (String.IsNullOrEmpty(path))
{
return false;
}
if (IsReservedDeviceName(path))
{
return false;
}
try
{
// Use 'File.GetAttributes()' because we want to get access exceptions.
FileAttributes attributes = File.GetAttributes(path);
isDirectory = attributes.HasFlag(FileAttributes.Directory);
return (int)attributes != -1;
}
catch (IOException)
{
return false;
}
}
internal static bool FileExists(string path)
{
bool itemExists = ItemExists(path, out bool isDirectory);
return (itemExists && (!isDirectory));
}
internal static bool DirectoryExists(string path)
{
bool itemExists = ItemExists(path, out bool isDirectory);
return (itemExists && isDirectory);
}
internal static void NativeEnumerateDirectory(string directory, out List<string> directories, out List<string> files)
{
IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
@@ -1627,32 +1627,33 @@ namespace System.Management.Automation.Help
/// <returns></returns>
internal static string GetFilePath(string path)
{
FileInfo item = new FileInfo(path);
// We use 'FileInfo.Attributes' (not 'FileInfo.Exist')
// because we want to get exceptions
// like UnauthorizedAccessException or IOException.
if ((int)item.Attributes != -1)
{
return path;
}
#if UNIX
// On Linux, file paths are case sensitive.
// The user does not have control over the files (HelpInfo.xml, .zip, and cab) that are generated by the Publishing team.
// The logic below is to support updating help content via sourcepath parameter for case insensitive files.
FileInfo item = new FileInfo(path);
string directoryPath = item.Directory.FullName;
var dirInfo = item.Directory;
string fileName = item.Name;
// Prerequisite: The directory in the given path must exist and it is case sensitive.
if (Utils.DirectoryExists(directoryPath))
if (dirInfo.Exists)
{
// Get the list of files in the directory.
string[] fileList = Directory.GetFiles(directoryPath);
foreach (string filePath in fileList)
FileInfo[] fileList = dirInfo.GetFiles(searchPattern: fileName, new System.IO.EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive });
if (fileList.Length > 0)
{
if (filePath.EndsWith(fileName, StringComparison.OrdinalIgnoreCase))
{
return filePath;
}
return fileList[0].FullName;
}
}
#else
if (Utils.FileExists(path))
{
return path;
}
#endif
return null;
}
@@ -100,29 +100,45 @@ namespace Microsoft.PowerShell.Commands
} // NormalizePath
/// <summary>
/// Checks if the item exist at the specified path. if it exists then creates
/// Checks if the item exist at the specified path. if it exists then creates
/// appropriate directoryinfo or fileinfo object.
/// </summary>
/// <param name="path">
/// refers to the item for which we are checking for existence and creating filesysteminfo object.
/// Refers to the item for which we are checking for existence and creating filesysteminfo object.
/// </param>
/// <param name="isContainer">
/// return true if path points to a directory else returns false.
/// Return true if path points to a directory else returns false.
/// </param>
/// <returns></returns>
private static FileSystemInfo GetFileSystemInfo(string path, ref bool isContainer)
/// <returns>FileInfo or DirectoryInfo object.</returns>
/// <exception cref="System.ArgumentNullException">
/// The path is null.
/// </exception>
/// <exception cref="System.IO.IOException">
/// I/O error occurs.
/// </exception>
/// <exception cref="System.UnauthorizedAccessException">
/// An I/O error or a specific type of security error.
/// </exception>
private static FileSystemInfo GetFileSystemInfo(string path, out bool isContainer)
{
isContainer = false;
// We use 'FileInfo.Attributes' (not 'FileInfo.Exist')
// because we want to get exceptions
// like UnauthorizedAccessException or IOException.
FileSystemInfo fsinfo = new FileInfo(path);
var attr = fsinfo.Attributes;
var exists = (int)attr != -1;
isContainer = exists && attr.HasFlag(FileAttributes.Directory);
if (Utils.FileExists(path))
if (exists)
{
return new FileInfo(path);
}
if (Utils.DirectoryExists(path))
{
isContainer = true;
return new DirectoryInfo(path);
if (isContainer)
{
return new DirectoryInfo(path);
}
else
{
return fsinfo;
}
}
return null;
@@ -445,18 +461,7 @@ namespace Microsoft.PowerShell.Commands
if (driveIsFixed)
{
// Since the drive is fixed, ensure the root is valid.
try
{
validDrive = Utils.DirectoryExists(drive.Root);
}
catch (IOException)
{
// Ignore, the network path may not be found.
}
catch (UnauthorizedAccessException)
{
// Ignore, we may be running in an AppContainer
}
validDrive = Directory.Exists(drive.Root);
}
if (validDrive)
@@ -1494,11 +1499,12 @@ namespace Microsoft.PowerShell.Commands
path = NormalizePath(path);
if (Utils.ItemExists(path, out bool isDirectory))
var fsinfo = GetFileSystemInfo(path, out bool isDirectory);
if (fsinfo != null)
{
if (isDirectory)
{
DirectoryInfo directory = new DirectoryInfo(path);
InodeTracker tracker = null;
if (recurse)
@@ -1506,18 +1512,15 @@ namespace Microsoft.PowerShell.Commands
GetChildDynamicParameters fspDynamicParam = DynamicParameters as GetChildDynamicParameters;
if (fspDynamicParam != null && fspDynamicParam.FollowSymlink)
{
tracker = new InodeTracker(directory.FullName);
tracker = new InodeTracker(fsinfo.FullName);
}
}
// Enumerate the directory
Dir(directory, recurse, depth, nameOnly, returnContainers, tracker);
Dir((DirectoryInfo)fsinfo, recurse, depth, nameOnly, returnContainers, tracker);
}
else
{
// Maybe the path is a file name so try a FileInfo instead
FileInfo fileInfo = new FileInfo(path);
FlagsExpression<FileAttributes> evaluator = null;
FlagsExpression<FileAttributes> switchEvaluator = null;
GetChildDynamicParameters fspDynamicParam = DynamicParameters as GetChildDynamicParameters;
@@ -1534,16 +1537,16 @@ namespace Microsoft.PowerShell.Commands
if (evaluator != null)
{
attributeFilter = evaluator.Evaluate(fileInfo.Attributes); // expressions
attributeFilter = evaluator.Evaluate(fsinfo.Attributes); // expressions
filterHidden = evaluator.ExistsInExpression(FileAttributes.Hidden);
}
if (switchEvaluator != null)
{
switchAttributeFilter = switchEvaluator.Evaluate(fileInfo.Attributes); // switch parameters
switchAttributeFilter = switchEvaluator.Evaluate(fsinfo.Attributes); // switch parameters
switchFilterHidden = switchEvaluator.ExistsInExpression(FileAttributes.Hidden);
}
bool hidden = (fileInfo.Attributes & FileAttributes.Hidden) != 0;
bool hidden = (fsinfo.Attributes & FileAttributes.Hidden) != 0;
// if "Hidden" is explicitly specified anywhere in the attribute filter, then override
// default hidden attribute filter.
@@ -1553,12 +1556,12 @@ namespace Microsoft.PowerShell.Commands
if (nameOnly)
{
WriteItemObject(
fileInfo.Name,
fileInfo.FullName,
fsinfo.Name,
fsinfo.FullName,
false);
}
else
WriteItemObject(fileInfo, path, false);
WriteItemObject(fsinfo, path, false);
}
}
}
@@ -2156,9 +2159,13 @@ namespace Microsoft.PowerShell.Commands
// non-existing targets on either Windows or Linux.
try
{
exists = Utils.ItemExists(strTargetPath, out isDirectory);
exists = GetFileSystemInfo(strTargetPath, out isDirectory) != null;
// Pretend the target exists if we're making a symbolic link.
if (itemType == ItemType.SymbolicLink)
exists = true; // pretend the target exists if we're making a symbolic link
{
exists = true;
}
}
catch (Exception e)
{
@@ -2189,7 +2196,7 @@ namespace Microsoft.PowerShell.Commands
try
{
symLinkExists = Utils.ItemExists(path, out isSymLinkDirectory);
symLinkExists = GetFileSystemInfo(path, out isSymLinkDirectory) != null;
}
catch (Exception e)
{
@@ -2318,7 +2325,7 @@ namespace Microsoft.PowerShell.Commands
try
{
exists = Utils.ItemExists(strTargetPath, out isDirectory);
exists = GetFileSystemInfo(strTargetPath, out isDirectory) != null;
}
catch (Exception e)
{
@@ -2341,12 +2348,11 @@ namespace Microsoft.PowerShell.Commands
}
bool isPathDirectory = false;
bool pathExists = false;
FileSystemInfo pathDirInfo;
try
{
pathExists = Utils.ItemExists(path, out isPathDirectory);
pathDirInfo = GetFileSystemInfo(path, out isPathDirectory);
}
catch (Exception e)
{
@@ -2354,7 +2360,7 @@ namespace Microsoft.PowerShell.Commands
return;
}
DirectoryInfo pathDirInfo = new DirectoryInfo(path);
bool pathExists = pathDirInfo != null;
if (pathExists)
{
@@ -2367,7 +2373,7 @@ namespace Microsoft.PowerShell.Commands
}
//Junctions cannot have files
if (DirectoryInfoHasChildItems(pathDirInfo))
if (DirectoryInfoHasChildItems((DirectoryInfo)pathDirInfo))
{
string message = StringUtil.Format(FileSystemProviderStrings.DirectoryNotEmpty, path);
WriteError(new ErrorRecord(new IOException(message), "DirectoryNotEmpty", ErrorCategory.WriteError, path));
@@ -2397,6 +2403,7 @@ namespace Microsoft.PowerShell.Commands
else
{
CreateDirectory(path, false);
pathDirInfo = new DirectoryInfo(path);
}
try
@@ -2730,8 +2737,7 @@ namespace Microsoft.PowerShell.Commands
}
#endif
bool iscontainer = false;
FileSystemInfo fsinfo = GetFileSystemInfo(path, ref iscontainer);
FileSystemInfo fsinfo = GetFileSystemInfo(path, out bool iscontainer);
if (fsinfo == null)
{
String error = StringUtil.Format(FileSystemProviderStrings.ItemDoesNotExist, path);
@@ -3187,7 +3193,8 @@ namespace Microsoft.PowerShell.Commands
try
{
result = Utils.ItemExists(path, out bool _);
var fsinfo = GetFileSystemInfo(path, out bool _);
result = fsinfo != null;
FileSystemItemProviderDynamicParameters itemExistsDynamicParameters =
DynamicParameters as FileSystemItemProviderDynamicParameters;
@@ -3195,7 +3202,7 @@ namespace Microsoft.PowerShell.Commands
// If the items see if we need to check the age of the file...
if (result && itemExistsDynamicParameters != null)
{
DateTime lastWriteTime = File.GetLastWriteTime(path);
DateTime lastWriteTime = fsinfo.LastWriteTime;
if (itemExistsDynamicParameters.OlderThan.HasValue)
{
@@ -3492,8 +3499,6 @@ namespace Microsoft.PowerShell.Commands
if (op["Items"] != null)
{
bool destinationPathIsFile = Utils.FileExists(destinationPath);
PSObject obj = (PSObject)op["Items"];
ArrayList itemsList = (ArrayList)obj.BaseObject;
foreach (PSObject item in itemsList)
@@ -3505,7 +3510,7 @@ namespace Microsoft.PowerShell.Commands
if (isContainer)
{
if (destinationPathIsFile)
if (File.Exists(destinationPath))
{
Exception e = new IOException(String.Format(
CultureInfo.InvariantCulture,
@@ -3866,7 +3871,7 @@ namespace Microsoft.PowerShell.Commands
CreateDirectory(destination, false);
// If failed to create directory
if (!Utils.DirectoryExists(destination))
if (!Directory.Exists(destination))
{
return;
}
@@ -4935,11 +4940,11 @@ namespace Microsoft.PowerShell.Commands
}
#if UNIX
// We don't use the Directory class for Unix because the path
// We don't use the Directory.EnumerateFiles() for Unix because the path
// may contain additional globbing patterns such as '[ab]'
// which Directory.EnumerateFiles() processes, giving undesireable
// results in this context.
if (!Utils.ItemExists(result))
if (!File.Exists(result) && !Directory.Exists(result))
{
String error = StringUtil.Format(FileSystemProviderStrings.ItemDoesNotExist, path);
Exception e = new IOException(error);
@@ -5401,8 +5406,7 @@ namespace Microsoft.PowerShell.Commands
{
currentPath = MakePath(currentPath, childName);
Boolean isContainer = false;
FileSystemInfo fsinfo = GetFileSystemInfo(currentPath, ref isContainer);
var fsinfo = GetFileSystemInfo(currentPath, out bool _);
// Clean up the child name to proper casing and short-path
// expansion if required. Also verify that .NET hasn't over-normalized
@@ -5425,8 +5429,7 @@ namespace Microsoft.PowerShell.Commands
else
{
// We couldn't find the item
if ((!isContainer) &&
(tokenizedPathStack.Count == 0))
if (tokenizedPathStack.Count == 0)
{
throw PSTraceSource.NewArgumentException("path", FileSystemProviderStrings.ItemDoesNotExist, currentPath);
}
@@ -5573,7 +5576,7 @@ namespace Microsoft.PowerShell.Commands
path = NormalizePath(path);
return Utils.DirectoryExists(path);
return Directory.Exists(path);
}
#region MoveItem
@@ -5988,20 +5991,7 @@ namespace Microsoft.PowerShell.Commands
try
{
FileSystemInfo fileSystemObject = null;// Get the directory object
if (Utils.ItemExists(path, out bool isDirectory))
{
if (isDirectory)
{
fileSystemObject = new DirectoryInfo(path);
}
else
{
// Maybe the path is a file name so try a FileInfo instead
fileSystemObject = new FileInfo(path);
}
}
var fileSystemObject = GetFileSystemInfo(path, out bool isDirectory);
if (fileSystemObject == null)
{
@@ -6143,28 +6133,14 @@ namespace Microsoft.PowerShell.Commands
path = NormalizePath(path);
PSObject results = new PSObject();
PSObject fileSystemInfoShell = null;
bool isContainer = false;
// Create a PSObject with either a DirectoryInfo or FileInfo object
// at its core.
var fsinfo = GetFileSystemInfo(path, out bool isDirectory);
if (Utils.ItemExists(path, out bool isDirectory))
// Create a PSObject with either a DirectoryInfo or FileInfo object at its core.
if (fsinfo != null)
{
if (isDirectory)
{
isContainer = true;
fileSystemInfoShell = PSObject.AsPSObject(new DirectoryInfo(path));
}
else
{
// Maybe the path is a file name so try a FileInfo instead
fileSystemInfoShell = PSObject.AsPSObject(new FileInfo(path));
}
}
PSObject fileSystemInfoShell = PSObject.AsPSObject(fsinfo);
if (fileSystemInfoShell != null)
{
bool propertySet = false;
foreach (PSMemberInfo property in propertyToSet.Properties)
@@ -6174,7 +6150,7 @@ namespace Microsoft.PowerShell.Commands
// Get the confirmation text
string action = null;
if (isContainer)
if (isDirectory)
{
action = FileSystemProviderStrings.SetPropertyActionDirectory;
}
@@ -137,7 +137,7 @@ namespace System.Management.Automation
internal static SecurityZone GetFileSecurityZone(string filePath)
{
Diagnostics.Assert(Path.IsPathRooted(filePath), "Caller makes sure the path is rooted.");
Diagnostics.Assert(Utils.FileExists(filePath), "Caller makes sure the file exists.");
Diagnostics.Assert(File.Exists(filePath), "Caller makes sure the file exists.");
return MapSecurityZone(filePath);
}