diff --git a/Directory.Build.props b/Directory.Build.props
index 230e4f305..bbbd7977f 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -13,6 +13,7 @@
MIT
$(DefineConstants);FEATURE_ASYNC_FILE;FEATURE_ENUMERATION_OPTIONS;FEATURE_ADVANCED_PATH_OPERATIONSFEATURE_PATH_JOIN_WITH_SPAN
$(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE
+ $(DefineConstants);FEATURE_SUPPORTED_OS_ATTRIBUTE
diff --git a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs
index b47ed1a16..f619f9631 100644
--- a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs
+++ b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs
@@ -36,15 +36,8 @@ private string GetRandomTempDirectory()
public string CreateRandomDirectory()
{
var randomPath = this.GetRandomTempDirectory();
- try
- {
- _fileSystem.Directory.CreateDirectory(randomPath);
- return randomPath;
- }
- catch (Exception ex)
- {
- throw (ex);
- }
+ _fileSystem.Directory.CreateDirectory(randomPath);
+ return randomPath;
}
private void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs = true, bool overwrite = true)
diff --git a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs
index 4824e1a9f..e623ec7d9 100644
--- a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs
+++ b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs
@@ -16,15 +16,8 @@ private static string GetRandomTempDirectory()
public static string CreateDirectory()
{
var randomPath = GetRandomTempDirectory();
- try
- {
- Directory.CreateDirectory(randomPath);
- return randomPath;
- }
- catch (Exception ex)
- {
- throw (ex);
- }
+ Directory.CreateDirectory(randomPath);
+ return randomPath;
}
private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs = true, bool overwrite = true)
diff --git a/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs b/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs
index bc845c1e1..7ae2ac68f 100644
--- a/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs
+++ b/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text.RegularExpressions;
@@ -125,6 +126,7 @@ public override bool Exists(string path)
}
}
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl(string path)
{
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
@@ -139,6 +141,7 @@ public override DirectorySecurity GetAccessControl(string path)
return directoryData.AccessControl;
}
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections)
{
return GetAccessControl(path);
@@ -442,6 +445,7 @@ public override void Move(string sourceDirName, string destDirName)
mockFileDataAccessor.MoveDirectory(fullSourcePath, fullDestPath);
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(string path, DirectorySecurity directorySecurity)
{
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
diff --git a/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs b/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs
index f3e342824..b583d98f7 100644
--- a/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs
+++ b/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs
@@ -1,4 +1,5 @@
-using System.Security.AccessControl;
+using System.Runtime.Versioning;
+using System.Security.AccessControl;
namespace System.IO.Abstractions.TestingHelpers
{
@@ -16,6 +17,7 @@ public MockDirectoryData() : base(string.Empty)
Attributes = FileAttributes.Directory;
}
+ [SupportedOSPlatform("windows")]
public new DirectorySecurity AccessControl
{
get
diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs
index 4f571200b..0c6244fa4 100644
--- a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs
+++ b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text;
using System.Threading;
@@ -125,9 +126,9 @@ public override void Copy(string sourceFileName, string destFileName, bool overw
Create(path, bufferSize, FileOptions.None);
public override Stream Create(string path, int bufferSize, FileOptions options) =>
- CreateInternal(path, options, null);
+ CreateInternal(path, options);
- private Stream CreateInternal(string path, FileOptions options, FileSecurity fileSecurity)
+ private Stream CreateInternal(string path, FileOptions options)
{
if (path == null)
{
@@ -137,10 +138,7 @@ private Stream CreateInternal(string path, FileOptions options, FileSecurity fil
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, nameof(path));
VerifyDirectoryExists(path);
- var mockFileData = new MockFileData(new byte[0])
- {
- AccessControl = fileSecurity
- };
+ var mockFileData = new MockFileData(new byte[0]);
mockFileDataAccessor.AddFile(path, mockFileData);
return OpenWriteInternal(path, options);
}
@@ -192,6 +190,7 @@ public override bool Exists(string path)
return file != null && !file.IsDirectory;
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(string path)
{
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
@@ -205,6 +204,7 @@ public override FileSecurity GetAccessControl(string path)
return fileData.AccessControl;
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(string path, AccessControlSections includeSections)
{
return GetAccessControl(path);
@@ -603,6 +603,7 @@ public override void Replace(string sourceFileName, string destinationFileName,
Move(sourceFileName, destinationFileName);
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(string path, FileSecurity fileSecurity)
{
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs
index 0ac2d35ec..213c9ed8b 100644
--- a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs
+++ b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text;
@@ -151,6 +152,7 @@ public string TextContents
///
/// Gets or sets of the . This is the object that is returned for this when calling .
///
+ [SupportedOSPlatform("windows")]
public FileSecurity AccessControl
{
get
diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs
index a8d65362f..9d53d1c75 100644
--- a/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs
+++ b/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs
@@ -1,4 +1,5 @@
-using System.Security.AccessControl;
+using System.Runtime.Versioning;
+using System.Security.AccessControl;
namespace System.IO.Abstractions.TestingHelpers
{
@@ -215,11 +216,13 @@ public override void Encrypt()
MockFileData.Attributes |= FileAttributes.Encrypted;
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl()
{
return mockFileSystem.File.GetAccessControl(this.path);
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(AccessControlSections includeSections)
{
return mockFileSystem.File.GetAccessControl(this.path, includeSections);
@@ -281,6 +284,7 @@ public override IFileInfo Replace(string destinationFileName, string destination
return mockFileSystem.FileInfo.FromFileName(destinationFileName);
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(FileSecurity fileSecurity)
{
mockFileSystem.File.SetAccessControl(this.path, fileSecurity);
diff --git a/src/System.IO.Abstractions/DirectoryBase.cs b/src/System.IO.Abstractions/DirectoryBase.cs
index ad53fad6b..8c130c1af 100644
--- a/src/System.IO.Abstractions/DirectoryBase.cs
+++ b/src/System.IO.Abstractions/DirectoryBase.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
namespace System.IO.Abstractions
@@ -24,6 +25,7 @@ protected DirectoryBase(IFileSystem fileSystem)
public abstract IDirectoryInfo CreateDirectory(string path);
///
+ [SupportedOSPlatform("windows")]
public abstract IDirectoryInfo CreateDirectory(string path, DirectorySecurity directorySecurity);
///
@@ -36,9 +38,11 @@ protected DirectoryBase(IFileSystem fileSystem)
public abstract bool Exists(string path);
///
+ [SupportedOSPlatform("windows")]
public abstract DirectorySecurity GetAccessControl(string path);
///
+ [SupportedOSPlatform("windows")]
public abstract DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections);
///
diff --git a/src/System.IO.Abstractions/DirectoryInfoWrapper.cs b/src/System.IO.Abstractions/DirectoryInfoWrapper.cs
index 1a64d7737..2557341a6 100644
--- a/src/System.IO.Abstractions/DirectoryInfoWrapper.cs
+++ b/src/System.IO.Abstractions/DirectoryInfoWrapper.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
namespace System.IO.Abstractions
@@ -91,6 +92,7 @@ public override void Create()
instance.Create();
}
+ [SupportedOSPlatform("windows")]
public override void Create(DirectorySecurity directorySecurity)
{
instance.Create(directorySecurity);
@@ -172,11 +174,13 @@ public override IEnumerable EnumerateFileSystemInfos(string sea
}
#endif
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl()
{
return instance.GetAccessControl();
}
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl(AccessControlSections includeSections)
{
return instance.GetAccessControl(includeSections);
@@ -253,6 +257,7 @@ public override void MoveTo(string destDirName)
instance.MoveTo(destDirName);
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(DirectorySecurity directorySecurity)
{
instance.SetAccessControl(directorySecurity);
diff --git a/src/System.IO.Abstractions/DirectoryWrapper.cs b/src/System.IO.Abstractions/DirectoryWrapper.cs
index 46300f19d..723d985fc 100644
--- a/src/System.IO.Abstractions/DirectoryWrapper.cs
+++ b/src/System.IO.Abstractions/DirectoryWrapper.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
namespace System.IO.Abstractions
@@ -17,6 +18,7 @@ public override IDirectoryInfo CreateDirectory(string path)
return new DirectoryInfoWrapper(FileSystem, directoryInfo);
}
+ [SupportedOSPlatform("windows")]
public override IDirectoryInfo CreateDirectory(string path, DirectorySecurity directorySecurity)
{
var directoryInfo = new DirectoryInfo(path);
@@ -39,11 +41,13 @@ public override bool Exists(string path)
return Directory.Exists(path);
}
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl(string path)
{
return new DirectoryInfo(path).GetAccessControl();
}
+ [SupportedOSPlatform("windows")]
public override DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections)
{
return new DirectoryInfo(path).GetAccessControl(includeSections);
@@ -165,6 +169,7 @@ public override void Move(string sourceDirName, string destDirName)
Directory.Move(sourceDirName, destDirName);
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(string path, DirectorySecurity directorySecurity)
{
new DirectoryInfo(path).SetAccessControl(directorySecurity);
diff --git a/src/System.IO.Abstractions/DriveInfoWrapper.cs b/src/System.IO.Abstractions/DriveInfoWrapper.cs
index dfc97b1b0..334c69655 100644
--- a/src/System.IO.Abstractions/DriveInfoWrapper.cs
+++ b/src/System.IO.Abstractions/DriveInfoWrapper.cs
@@ -1,4 +1,6 @@
-namespace System.IO.Abstractions
+using System.Runtime.Versioning;
+
+namespace System.IO.Abstractions
{
///
/// The wrapper for a .
@@ -151,6 +153,7 @@ public override string VolumeLabel
{
get { return instance.VolumeLabel; }
+ [SupportedOSPlatform("windows")]
set { instance.VolumeLabel = value; }
}
diff --git a/src/System.IO.Abstractions/FileBase.cs b/src/System.IO.Abstractions/FileBase.cs
index 40c0dd5c9..24a3c04ac 100644
--- a/src/System.IO.Abstractions/FileBase.cs
+++ b/src/System.IO.Abstractions/FileBase.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text;
@@ -92,9 +93,11 @@ protected FileBase(IFileSystem fileSystem)
///
+ [SupportedOSPlatform("windows")]
public abstract FileSecurity GetAccessControl(string path);
///
+ [SupportedOSPlatform("windows")]
public abstract FileSecurity GetAccessControl(string path, AccessControlSections includeSections);
@@ -314,6 +317,7 @@ protected FileBase(IFileSystem fileSystem)
public abstract void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors);
///
+ [SupportedOSPlatform("windows")]
public abstract void SetAccessControl(string path, FileSecurity fileSecurity);
///
diff --git a/src/System.IO.Abstractions/FileInfoWrapper.cs b/src/System.IO.Abstractions/FileInfoWrapper.cs
index 2c23dc5a3..ca31e1910 100644
--- a/src/System.IO.Abstractions/FileInfoWrapper.cs
+++ b/src/System.IO.Abstractions/FileInfoWrapper.cs
@@ -1,4 +1,5 @@
-using System.Security.AccessControl;
+using System.Runtime.Versioning;
+using System.Security.AccessControl;
namespace System.IO.Abstractions
{
@@ -109,21 +110,25 @@ public override StreamWriter CreateText()
return instance.CreateText();
}
+ [SupportedOSPlatform("windows")]
public override void Decrypt()
{
instance.Decrypt();
}
+ [SupportedOSPlatform("windows")]
public override void Encrypt()
{
instance.Encrypt();
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl()
{
return instance.GetAccessControl();
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(AccessControlSections includeSections)
{
return instance.GetAccessControl(includeSections);
@@ -181,6 +186,7 @@ public override IFileInfo Replace(string destinationFileName, string destination
return new FileInfoWrapper(FileSystem, instance.Replace(destinationFileName, destinationBackupFileName, ignoreMetadataErrors));
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(FileSecurity fileSecurity)
{
instance.SetAccessControl(fileSecurity);
diff --git a/src/System.IO.Abstractions/FileWrapper.cs b/src/System.IO.Abstractions/FileWrapper.cs
index 1d41f34cb..dc2afdc73 100644
--- a/src/System.IO.Abstractions/FileWrapper.cs
+++ b/src/System.IO.Abstractions/FileWrapper.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text;
@@ -67,6 +68,7 @@ public override StreamWriter CreateText(string path)
return File.CreateText(path);
}
+ [SupportedOSPlatform("windows")]
public override void Decrypt(string path)
{
File.Decrypt(path);
@@ -77,6 +79,7 @@ public override void Delete(string path)
File.Delete(path);
}
+ [SupportedOSPlatform("windows")]
public override void Encrypt(string path)
{
File.Encrypt(path);
@@ -87,11 +90,13 @@ public override bool Exists(string path)
return File.Exists(path);
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(string path)
{
return new FileInfo(path).GetAccessControl();
}
+ [SupportedOSPlatform("windows")]
public override FileSecurity GetAccessControl(string path, AccessControlSections includeSections)
{
return new FileInfo(path).GetAccessControl(includeSections);
@@ -233,6 +238,7 @@ public override void Replace(string sourceFileName, string destinationFileName,
}
+ [SupportedOSPlatform("windows")]
public override void SetAccessControl(string path, FileSecurity fileSecurity)
{
new FileInfo(path).SetAccessControl(fileSecurity);
diff --git a/src/System.IO.Abstractions/IFile.cs b/src/System.IO.Abstractions/IFile.cs
index dfa45c14f..ebfff17cc 100644
--- a/src/System.IO.Abstractions/IFile.cs
+++ b/src/System.IO.Abstractions/IFile.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Runtime.Versioning;
using System.Security.AccessControl;
using System.Text;
@@ -43,8 +44,10 @@ public partial interface IFile
bool Exists(string path);
///
+ [SupportedOSPlatform("windows")]
FileSecurity GetAccessControl(string path);
///
+ [SupportedOSPlatform("windows")]
FileSecurity GetAccessControl(string path, AccessControlSections includeSections);
///
@@ -98,6 +101,7 @@ public partial interface IFile
///
void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors);
///
+ [SupportedOSPlatform("windows")]
void SetAccessControl(string path, FileSecurity fileSecurity);
///
void SetAttributes(string path, FileAttributes fileAttributes);
diff --git a/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs b/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs
new file mode 100644
index 000000000..ef6635b4f
--- /dev/null
+++ b/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs
@@ -0,0 +1,12 @@
+#if !FEATURE_SUPPORTED_OS_ATTRIBUTE
+namespace System.Runtime.Versioning
+{
+ [AttributeUsage(AttributeTargets.All)]
+ internal class SupportedOSPlatformAttribute : Attribute
+ {
+ public SupportedOSPlatformAttribute(string _)
+ {
+ }
+ }
+}
+#endif
diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/System.IO.Abstractions.TestingHelpers.Tests.csproj b/tests/System.IO.Abstractions.TestingHelpers.Tests/System.IO.Abstractions.TestingHelpers.Tests.csproj
index 99e2b56c3..06e8d028f 100644
--- a/tests/System.IO.Abstractions.TestingHelpers.Tests/System.IO.Abstractions.TestingHelpers.Tests.csproj
+++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/System.IO.Abstractions.TestingHelpers.Tests.csproj
@@ -5,6 +5,7 @@
The unit tests for our pre-built mocks
System.IO.Abstractions.TestingHelpers.Tests
System.IO.Abstractions.TestingHelpers.Tests
+ CA1416
false
true
diff --git a/tests/System.IO.Abstractions.Tests/FileSystemTests.cs b/tests/System.IO.Abstractions.Tests/FileSystemTests.cs
index 61431e482..4905cb453 100644
--- a/tests/System.IO.Abstractions.Tests/FileSystemTests.cs
+++ b/tests/System.IO.Abstractions.Tests/FileSystemTests.cs
@@ -13,7 +13,10 @@ public void Is_Serializable()
var memoryStream = new MemoryStream();
var serializer = new Runtime.Serialization.Formatters.Binary.BinaryFormatter();
+
+#pragma warning disable SYSLIB0011
serializer.Serialize(memoryStream, fileSystem);
+#pragma warning restore SYSLIB0011
Assert.That(memoryStream.Length > 0, "Length didn't increase after serialization task.");
}