Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corefx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Kuhne <jeremy.kuhne@microsoft.com>2018-03-07 21:14:24 +0300
committerGitHub <noreply@github.com>2018-03-07 21:14:24 +0300
commit41a2120b233cc02c175f812e4e19e3f058396cb0 (patch)
treec1ee9d79fe94f102b9c56504b09c68071609dc44 /src/System.IO.FileSystem/tests
parent7d00be159973959bbe6bbf1a811c8d50f83b8ce9 (diff)
Support trimmed paths in FileInfo (#27809)
* Support trimmed paths in FileInfo Some paths are not creatable in Windows without special syntax. Notably paths with trailing spaces and periods. As GetFullPath() (and GetFullPathName()) trim these we would lose the correct file name as we passed the path around. With the enumeration changes we now populate FileInfo correctly- this change allows the other methods to work when wrapped around such a path. * Tweak comments. Remove NotSupported and SecurityException from Exists as these are no longer thrown. Add a test fix I hadn't staged correctly.
Diffstat (limited to 'src/System.IO.FileSystem/tests')
-rw-r--r--src/System.IO.FileSystem/tests/Enumeration/TrimmedPaths.netcoreapp.cs177
1 files changed, 171 insertions, 6 deletions
diff --git a/src/System.IO.FileSystem/tests/Enumeration/TrimmedPaths.netcoreapp.cs b/src/System.IO.FileSystem/tests/Enumeration/TrimmedPaths.netcoreapp.cs
index 8621e8eb66..7ae7943b3b 100644
--- a/src/System.IO.FileSystem/tests/Enumeration/TrimmedPaths.netcoreapp.cs
+++ b/src/System.IO.FileSystem/tests/Enumeration/TrimmedPaths.netcoreapp.cs
@@ -17,11 +17,11 @@ namespace System.IO.Tests.Enumeration
// to access without using the \\?\ device syntax. We should, however, be able to find them
// and retain the filename in the info classes and string results.
- var directory = Directory.CreateDirectory(GetTestFilePath());
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
File.Create(@"\\?\" + Path.Combine(directory.FullName, "Trailing space ")).Dispose();
File.Create(@"\\?\" + Path.Combine(directory.FullName, "Trailing period.")).Dispose();
- var files = directory.GetFiles();
+ FileInfo[] files = directory.GetFiles();
Assert.Equal(2, files.Count());
FSAssert.EqualWhenOrdered(new string[] { "Trailing space ", "Trailing period." }, files.Select(f => f.Name));
@@ -38,7 +38,7 @@ namespace System.IO.Tests.Enumeration
// to access without using the \\?\ device syntax. We should, however, be able to delete them
// from the info class.
- var directory = Directory.CreateDirectory(GetTestFilePath());
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
File.Create(@"\\?\" + Path.Combine(directory.FullName, "Trailing space ")).Dispose();
File.Create(@"\\?\" + Path.Combine(directory.FullName, "Trailing period.")).Dispose();
@@ -47,18 +47,183 @@ namespace System.IO.Tests.Enumeration
var paths = Directory.GetFiles(directory.FullName);
Assert.All(paths, p => Assert.False(File.Exists(p)));
- var files = directory.GetFiles();
+ FileInfo[] files = directory.GetFiles();
Assert.Equal(2, files.Count());
Assert.All(files, f => Assert.True(f.Exists));
- foreach (var f in files)
+ foreach (FileInfo f in files)
f.Refresh();
Assert.All(files, f => Assert.True(f.Exists));
- foreach (var f in files)
+ foreach (FileInfo f in files)
{
f.Delete();
f.Refresh();
}
Assert.All(files, f => Assert.False(f.Exists));
+
+ foreach (FileInfo f in files)
+ {
+ f.Create().Dispose();
+ f.Refresh();
+ }
+ Assert.All(files, f => Assert.True(f.Exists));
+ }
+
+ [Fact]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ public void TrimmedPathsOpen_Windows()
+ {
+ // Trailing spaces and periods are eaten when normalizing in Windows, making them impossible
+ // to access without using the \\?\ device syntax. We should, however, be able to open them
+ // from the info class when enumerating.
+
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
+ string fileOne = Path.Join(directory.FullName, "Trailing space ");
+ string fileTwo = Path.Join(directory.FullName, "Trailing period.");
+ File.Create(@"\\?\" + fileOne).Dispose();
+ File.Create(@"\\?\" + fileTwo).Dispose();
+
+ FileInfo[] files = directory.GetFiles();
+ Assert.Equal(2, files.Length);
+ foreach (FileInfo fi in directory.GetFiles())
+ {
+ // Shouldn't throw hitting any of the Open overloads
+ using (FileStream stream = fi.Open(FileMode.Open))
+ { }
+ using (FileStream stream = fi.Open(FileMode.Open, FileAccess.Read))
+ { }
+ using (FileStream stream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ { }
+ using (FileStream stream = fi.OpenRead())
+ { }
+ using (FileStream stream = fi.OpenWrite())
+ { }
+ }
+ }
+
+ [Fact]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ public void TrimmedPathsText_Windows()
+ {
+ // Trailing spaces and periods are eaten when normalizing in Windows, making them impossible
+ // to access without using the \\?\ device syntax. We should, however, be able to open readers
+ // and writers from the the info class when enumerating.
+
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
+ string fileOne = Path.Join(directory.FullName, "Trailing space ");
+ string fileTwo = Path.Join(directory.FullName, "Trailing period.");
+ File.WriteAllText(@"\\?\" + fileOne, "space");
+ File.WriteAllText(@"\\?\" + fileTwo, "period");
+
+ FileInfo[] files = directory.GetFiles();
+ Assert.Equal(2, files.Length);
+ foreach (FileInfo fi in directory.GetFiles())
+ {
+ using (StreamReader reader = fi.OpenText())
+ {
+ string content = reader.ReadToEnd();
+ if (fi.FullName.EndsWith(fileOne))
+ {
+ Assert.Equal("space", content);
+ }
+ else if (fi.FullName.EndsWith(fileTwo))
+ {
+ Assert.Equal("period", content);
+ }
+ else
+ {
+ Assert.False(true, $"Unexpected name '{fi.FullName}'");
+ }
+ }
+
+ using (StreamWriter writer = fi.CreateText())
+ {
+ writer.Write("foo");
+ }
+
+ using (StreamReader reader = fi.OpenText())
+ {
+ Assert.Equal("foo", reader.ReadToEnd());
+ }
+
+ using (StreamWriter writer = fi.AppendText())
+ {
+ writer.Write("bar");
+ }
+
+ using (StreamReader reader = fi.OpenText())
+ {
+ Assert.Equal("foobar", reader.ReadToEnd());
+ }
+ }
+ }
+
+ [Fact]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ public void TrimmedPathsCopyTo_Windows()
+ {
+ // Trailing spaces and periods are eaten when normalizing in Windows, making them impossible
+ // to access without using the \\?\ device syntax. We should, however, be able to copy them
+ // without the special syntax from the info class when enumerating.
+
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
+ string fileOne = Path.Join(directory.FullName, "Trailing space ");
+ string fileTwo = Path.Join(directory.FullName, "Trailing period.");
+ File.Create(@"\\?\" + fileOne).Dispose();
+ File.Create(@"\\?\" + fileTwo).Dispose();
+
+ FileInfo[] files = directory.GetFiles();
+ Assert.Equal(2, files.Length);
+ foreach (FileInfo fi in directory.GetFiles())
+ {
+ FileInfo newInfo = fi.CopyTo(Path.Join(directory.FullName, GetTestFileName()));
+ Assert.True(newInfo.Exists);
+ FileInfo newerInfo = fi.CopyTo(Path.Join(directory.FullName, GetTestFileName()), overwrite: true);
+ Assert.True(newerInfo.Exists);
+ }
+
+ Assert.Equal(6, directory.GetFiles().Length);
+ }
+
+ [Fact]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ public void TrimmedPathsReplace_Windows()
+ {
+ // Trailing spaces and periods are eaten when normalizing in Windows, making them impossible
+ // to access without using the \\?\ device syntax. We should, however, be able to replace them
+ // from the info class when enumerating.
+
+ DirectoryInfo directory = Directory.CreateDirectory(GetTestFilePath());
+ string fileOne = Path.Join(directory.FullName, "Trailing space ");
+ string fileTwo = Path.Join(directory.FullName, "Trailing period.");
+ File.WriteAllText(@"\\?\" + fileOne, "space");
+ File.WriteAllText(@"\\?\" + fileTwo, "period");
+
+ FileInfo[] files = directory.GetFiles();
+ Assert.Equal(2, files.Length);
+
+ FileInfo destination = new FileInfo(Path.Join(directory.FullName, GetTestFileName()));
+ destination.Create().Dispose();
+
+ foreach (FileInfo fi in files)
+ {
+ fi.Replace(destination.FullName, null);
+ using (StreamReader reader = destination.OpenText())
+ {
+ string content = reader.ReadToEnd();
+ if (fi.FullName.EndsWith(fileOne))
+ {
+ Assert.Equal("space", content);
+ }
+ else if (fi.FullName.EndsWith(fileTwo))
+ {
+ Assert.Equal("period", content);
+ }
+ else
+ {
+ Assert.False(true, $"Unexpected name '{fi.FullName}'");
+ }
+ }
+ }
}
}
}