Skip to content

Commit 8b1887a

Browse files
authored
Merge pull request #10006 from wastoresh/fileattribute
[Storage] Support preserverPerserve File Attributes
2 parents 78e72b7 + f690341 commit 8b1887a

File tree

8 files changed

+128
-14
lines changed

8 files changed

+128
-14
lines changed

src/Storage/Storage.Management.Test/ScenarioTests/StorageDataPlaneTests.ps1

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,26 @@ function Test-File
5656
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
5757
Assert-AreEqual $file.Count 1
5858
Assert-AreEqual $file[0].Name $objectName1
59-
Set-AzStorageFileContent -source $localSrcFile -ShareName $shareName -Path $objectName1 -Force -Context $storageContext
59+
60+
if ($Env:OS -eq "Windows_NT")
61+
{
62+
Set-AzStorageFileContent -source $localSrcFile -ShareName $shareName -Path $objectName1 -PreserveSMBAttribute -Force -Context $storageContext
63+
}
64+
else
65+
{
66+
Set-AzStorageFileContent -source $localSrcFile -ShareName $shareName -Path $objectName1 -Force -Context $storageContext
67+
}
6068
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext
6169
Assert-AreEqual $file.Count 1
6270
Assert-AreEqual $file[0].Name $objectName1
71+
if ($Env:OS -eq "Windows_NT")
72+
{
73+
$file[0].FetchAttributes()
74+
$localFileProperties = Get-ItemProperty $localSrcFile
75+
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].Properties.CreationTime.ToUniversalTime().Ticks
76+
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].Properties.LastWriteTime.ToUniversalTime().Ticks
77+
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].Properties.NtfsAttributes.ToString()
78+
}
6379

6480
Start-AzStorageFileCopy -SrcShareName $shareName -SrcFilePath $objectName1 -DestShareName $shareName -DestFilePath $objectName2 -Force -Context $storageContext -DestContext $storageContext
6581
Get-AzStorageFileCopyState -ShareName $shareName -FilePath $objectName2 -Context $storageContext -WaitForComplete
@@ -68,13 +84,29 @@ function Test-File
6884
Assert-AreEqual $file[0].Name $objectName1
6985
Assert-AreEqual $file[1].Name $objectName2
7086

71-
$t = Get-AzStorageFileContent -ShareName $shareName -Path $objectName1 -Destination $localDestFile -Force -Context $storageContext -asjob
87+
$t = Get-AzStorageFileContent -ShareName $shareName -Path $objectName1 -Destination $localDestFile -Force -Context $storageContext -asjob
7288
$t | wait-job
7389
Assert-AreEqual $t.State "Completed"
7490
Assert-AreEqual $t.Error $null
7591
Assert-AreEqual (Get-FileHash -Path $localDestFile -Algorithm MD5).Hash (Get-FileHash -Path $localSrcFile -Algorithm MD5).Hash
76-
Get-AzStorageFileContent -ShareName $shareName -Path $objectName1 -Destination $localDestFile -Force -Context $storageContext
92+
93+
if ($Env:OS -eq "Windows_NT")
94+
{
95+
Get-AzStorageFileContent -ShareName $shareName -Path $objectName1 -Destination $localDestFile -PreserveSMBAttribute -Force -Context $storageContext
96+
}
97+
else
98+
{
99+
Get-AzStorageFileContent -ShareName $shareName -Path $objectName1 -Destination $localDestFile -Force -Context $storageContext
100+
}
77101
Assert-AreEqual (Get-FileHash -Path $localDestFile -Algorithm MD5).Hash (Get-FileHash -Path $localSrcFile -Algorithm MD5).Hash
102+
if ($Env:OS -eq "Windows_NT")
103+
{
104+
$file = Get-AzStorageFile -ShareName $shareName -Path $objectName1 -Context $storageContext
105+
$localFileProperties = Get-ItemProperty $localSrcFile
106+
Assert-AreEqual $localFileProperties.CreationTime.ToUniversalTime().Ticks $file[0].Properties.CreationTime.ToUniversalTime().Ticks
107+
Assert-AreEqual $localFileProperties.LastWriteTime.ToUniversalTime().Ticks $file[0].Properties.LastWriteTime.ToUniversalTime().Ticks
108+
Assert-AreEqual $localFileProperties.Attributes.ToString() $file[0].Properties.NtfsAttributes.ToString()
109+
}
78110

79111
Remove-AzStorageFile -ShareName $shareName -Path $objectName1 -Context $storageContext
80112
$file = Get-AzStorageFile -ShareName $shareName -Context $storageContext

src/Storage/Storage.Management/ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
-->
2020
## Upcoming Release
2121
* Updated example in reference documentation for `Get-AzStorageAccountKey`
22+
* In upload/Downalod Azure File,support perserve the source File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in the destination file
23+
- Set-AzStorageFileContent
24+
- Get-AzStorageFileContent
2225
* Fix Upload block blob with properties/metadate fail on container enabled ImmutabilityPolicy.
2326
- Set-AzStorageBlobContent
2427
* Support manage Azure File shares with Management plane API

src/Storage/Storage.Management/help/Get-AzStorageFileContent.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,31 @@ Downloads the contents of a file.
1818
Get-AzStorageFileContent [-ShareName] <String> [-Path] <String> [[-Destination] <String>] [-CheckMd5]
1919
[-PassThru] [-Force] [-AsJob] [-Context <IStorageContext>] [-ServerTimeoutPerRequest <Int32>]
2020
[-ClientTimeoutPerRequest <Int32>] [-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>]
21-
[-WhatIf] [-Confirm] [<CommonParameters>]
21+
[-WhatIf] [-Confirm] [-PreserveSMBAttribute] [<CommonParameters>]
2222
```
2323

2424
### Share
2525
```
2626
Get-AzStorageFileContent [-Share] <CloudFileShare> [-Path] <String> [[-Destination] <String>] [-CheckMd5]
2727
[-PassThru] [-Force] [-AsJob] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
2828
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [-WhatIf] [-Confirm]
29-
[<CommonParameters>]
29+
[-PreserveSMBAttribute] [<CommonParameters>]
3030
```
3131

3232
### Directory
3333
```
3434
Get-AzStorageFileContent [-Directory] <CloudFileDirectory> [-Path] <String> [[-Destination] <String>]
3535
[-CheckMd5] [-PassThru] [-Force] [-AsJob] [-ServerTimeoutPerRequest <Int32>]
3636
[-ClientTimeoutPerRequest <Int32>] [-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>]
37-
[-WhatIf] [-Confirm] [<CommonParameters>]
37+
[-WhatIf] [-Confirm] [-PreserveSMBAttribute] [<CommonParameters>]
3838
```
3939

4040
### File
4141
```
4242
Get-AzStorageFileContent [-File] <CloudFile> [[-Destination] <String>] [-CheckMd5] [-PassThru] [-Force]
4343
[-AsJob] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
4444
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [-WhatIf] [-Confirm]
45-
[<CommonParameters>]
45+
[-PreserveSMBAttribute] [<CommonParameters>]
4646
```
4747

4848
## DESCRIPTION
@@ -65,6 +65,13 @@ PS C:\>Get-AzStorageFile -ShareName sample | ? {$_.GetType().Name -eq "CloudFile
6565

6666
This example downloads the files under sample file share
6767

68+
### Example 3: Download an Azure file to a local file, and perserve the Azure File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in the local file.
69+
```
70+
PS C:\>Get-AzStorageFileContent -ShareName sample -Path "dir1/file1" -Destination $localFilePath -PreserveSMBAttribute
71+
```
72+
73+
This example downloads an Azure file to a local file, and perserves the Azure File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in the local file.
74+
6875
## PARAMETERS
6976

7077
### -AsJob
@@ -262,6 +269,21 @@ Accept pipeline input: False
262269
Accept wildcard characters: False
263270
```
264271
272+
### -PreserveSMBAttribute
273+
Keep the source File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in destination File. This parameter is only available on Windows.
274+
275+
```yaml
276+
Type: System.Management.Automation.SwitchParameter
277+
Parameter Sets: (All)
278+
Aliases:
279+
280+
Required: False
281+
Position: Named
282+
Default value: None
283+
Accept pipeline input: False
284+
Accept wildcard characters: False
285+
```
286+
265287
### -ServerTimeoutPerRequest
266288
Specifies the service side time-out interval, in seconds, for a request. If the specified interval elapses before the service processes the request, the storage service returns an error.
267289

src/Storage/Storage.Management/help/Set-AzStorageFileContent.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,23 @@ Uploads the contents of a file.
1818
Set-AzStorageFileContent [-ShareName] <String> [-Source] <String> [[-Path] <String>] [-PassThru] [-Force]
1919
[-AsJob] [-Context <IStorageContext>] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
2020
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [-WhatIf] [-Confirm]
21-
[<CommonParameters>]
21+
[-PreserveSMBAttribute] [<CommonParameters>]
2222
```
2323

2424
### Share
2525
```
2626
Set-AzStorageFileContent [-Share] <CloudFileShare> [-Source] <String> [[-Path] <String>] [-PassThru] [-Force]
2727
[-AsJob] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
2828
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [-WhatIf] [-Confirm]
29-
[<CommonParameters>]
29+
[-PreserveSMBAttribute] [<CommonParameters>]
3030
```
3131

3232
### Directory
3333
```
3434
Set-AzStorageFileContent [-Directory] <CloudFileDirectory> [-Source] <String> [[-Path] <String>] [-PassThru]
3535
[-Force] [-AsJob] [-ServerTimeoutPerRequest <Int32>] [-ClientTimeoutPerRequest <Int32>]
3636
[-DefaultProfile <IAzureContextContainer>] [-ConcurrentTaskCount <Int32>] [-WhatIf] [-Confirm]
37-
[<CommonParameters>]
37+
[-PreserveSMBAttribute] [<CommonParameters>]
3838
```
3939

4040
## DESCRIPTION
@@ -68,6 +68,13 @@ That cmdlet runs a script block for each file that creates the appropriate path
6868
The result has the same name and same relative position with regard to the other files that this example uploads.
6969
For more information about script blocks, type `Get-Help about_Script_Blocks`.
7070

71+
### Example 3: Upload a local file to an Azure file, and perserve the local File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in the Azure file.
72+
```
73+
PS C:\>Get-AzStorageFileContent -source $localFilePath -ShareName sample -Path "dir1/file1" -PreserveSMBAttribute
74+
```
75+
76+
This example uploads a local file to an Azure file, and perserves the local File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in the Azure file.
77+
7178
## PARAMETERS
7279

7380
### -AsJob
@@ -221,6 +228,21 @@ Accept pipeline input: False
221228
Accept wildcard characters: False
222229
```
223230
231+
### -PreserveSMBAttribute
232+
Keep the source File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in destination File. This parameter is only available on Windows.
233+
234+
```yaml
235+
Type: System.Management.Automation.SwitchParameter
236+
Parameter Sets: (All)
237+
Aliases:
238+
239+
Required: False
240+
Position: Named
241+
Default value: None
242+
Accept pipeline input: False
243+
Accept wildcard characters: False
244+
```
245+
224246
### -ServerTimeoutPerRequest
225247
Specifies the length of the time-out period for the server part of a request.
226248

src/Storage/Storage/File/Cmdlet/GetAzureStorageFileContent.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ namespace Microsoft.WindowsAzure.Commands.Storage.File.Cmdlet
2727
using LocalConstants = Microsoft.WindowsAzure.Commands.Storage.File.Constants;
2828
using LocalDirectory = System.IO.Directory;
2929
using LocalPath = System.IO.Path;
30+
using System.Runtime.InteropServices;
3031

3132
[Cmdlet("Get", Azure.Commands.ResourceManager.Common.AzureRMConstants.AzurePrefix + "StorageFileContent", SupportsShouldProcess = true, DefaultParameterSetName = LocalConstants.ShareNameParameterSetName)]
3233
[OutputType(typeof(CloudFile))]
33-
public class GetAzureStorageFileContent : StorageFileDataManagementCmdletBase
34+
public class GetAzureStorageFileContent : StorageFileDataManagementCmdletBase, IDynamicParameters
3435
{
3536
[Parameter(
3637
Position = 0,
@@ -201,7 +202,8 @@ await DataMovementTransferHelper.DoTransfer(() =>
201202
targetFile,
202203
new DownloadOptions
203204
{
204-
DisableContentMD5Validation = !this.CheckMd5
205+
DisableContentMD5Validation = !this.CheckMd5,
206+
PreserveSMBAttributes = context is null ? false : context.PreserveSMBAttribute.IsPresent
205207
},
206208
this.GetTransferContext(progressRecord, fileToBeDownloaded.Properties.Length),
207209
CmdletCancellationToken);
@@ -221,5 +223,15 @@ await DataMovementTransferHelper.DoTransfer(() =>
221223
DoEndProcessing();
222224
}
223225
}
226+
public object GetDynamicParameters()
227+
{
228+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
229+
{
230+
context = new WindowsOnlyParameters();
231+
return context;
232+
}
233+
else return null;
234+
}
235+
private WindowsOnlyParameters context;
224236
}
225237
}

src/Storage/Storage/File/Cmdlet/SetAzureStorageFileContent.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ namespace Microsoft.WindowsAzure.Commands.Storage.File.Cmdlet
2626
using System.Net;
2727
using System.Threading.Tasks;
2828
using LocalConstants = Microsoft.WindowsAzure.Commands.Storage.File.Constants;
29+
using System.Runtime.InteropServices;
30+
using Microsoft.Azure.Storage.DataMovement;
2931

3032
[Cmdlet("Set", Azure.Commands.ResourceManager.Common.AzureRMConstants.AzurePrefix + "StorageFileContent", SupportsShouldProcess = true, DefaultParameterSetName = LocalConstants.ShareNameParameterSetName), OutputType(typeof(CloudFile))]
31-
public class SetAzureStorageFileContent : StorageFileDataManagementCmdletBase
33+
public class SetAzureStorageFileContent : StorageFileDataManagementCmdletBase, IDynamicParameters
3234
{
3335
[Parameter(
3436
Position = 0,
@@ -129,7 +131,10 @@ await DataMovementTransferHelper.DoTransfer(() =>
129131
this.TransferManager.UploadAsync(
130132
localFile.FullName,
131133
cloudFileToBeUploaded,
132-
null,
134+
new UploadOptions
135+
{
136+
PreserveSMBAttributes = context is null ? false : context.PreserveSMBAttribute.IsPresent
137+
},
133138
this.GetTransferContext(progressRecord, localFile.Length),
134139
this.CmdletCancellationToken),
135140
progressRecord,
@@ -227,5 +232,16 @@ private async Task<CloudFile> BuildCloudFileInstanceFromPathAsync(string default
227232
return baseDirectory.GetFileReferenceByPath(path);
228233
}
229234
}
235+
236+
public object GetDynamicParameters()
237+
{
238+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
239+
{
240+
context = new WindowsOnlyParameters();
241+
return context;
242+
}
243+
else return null;
244+
}
245+
private WindowsOnlyParameters context;
230246
}
231247
}

src/Storage/Storage/File/StorageFileDataManagementCmdletBase.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,5 +140,12 @@ protected SingleTransferContext GetTransferContext(ProgressRecord record, long t
140140

141141
return transferContext;
142142
}
143+
144+
// Dynamic Parameters which are only available on Windows.
145+
public class WindowsOnlyParameters
146+
{
147+
[Parameter(HelpMessage = "Keep the source File SMB properties (File Attributtes, File Creation Time, File Last Write Time) in destination File. This parameter is only available on Windows.")]
148+
public SwitchParameter PreserveSMBAttribute { get; set; }
149+
}
143150
}
144151
}
31.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)