Скопировать файл с FTP с помощью lastwritetime

#c# #.net #powershell

#c# #.net #powershell

Вопрос:

Как скопировать файл с ftp с сохранением исходного lastwritetime, а не текущего времени?

Этот файл загрузить и установить текущее время lastwritetime.

 $Login = 'anonymous'
$Pass  = ''
$url   = "ftp://ftp.intel.com/readme.txt"
$local = "C:docsreadme.txt"

$WC = new-object System.Net.WebClient
$WC.Credentials = [Net.NetworkCredential]::new($Login,$Pass)
$WC.downloadFile($url,$local)
  

Ответ №1:

Для того, чтобы установить «время последней записи на сервер», вам необходимо выполнить извлечение одновременно с получением фактического файла. Как только у вас будет и то, и другое, вы можете обновить локальное время последнего обновления временем с сервера.

Редактировать: Я обновил скрипт для выполнения двух запросов. Первый способ выполняется быстро, поскольку он извлекает только временную метку удаленного файла. Как только он у нас будет, мы загрузим файл на диск и обновим дату последнего изменения файла.

 $LocalFile = "c:tempreadme2.txt"

$url = "ftp://ftp.intel.com/readme.txt"

#Retrieve the DateTimestamp of the remote file
$WR = [Net.WebRequest]::Create($url)
$WR.Method = [Net.WebRequestMethods FTP]::GetDateTimestamp
$WR.Credentials = [Net.NetworkCredential]::new("anonymous","")
$Response = $WR.GetResponse()
$RemoteLastModifiedTime = $Response.LastModified

#Retrieve the file content
$WR1 = [Net.WebRequest]::Create($url)
$WR1.Method = [Net.WebRequestMethods FTP]::DownloadFile
$WR1.Credentials = [Net.NetworkCredential]::new("anonymous","")
$Response1 = $WR1.GetResponse()
$ResponseStream = $Response1.GetResponseStream()
# Create the target file on the local system and the download buffer
$LocalFileFile = New-Object IO.FileStream ($LocalFile,[IO.FileMode]::Create)
[byte[]]$ReadBuffer = New-Object byte[] 1024
# Loop through the download
do {
    $ReadLength = $ResponseStream.Read($ReadBuffer,0,1024)
    $LocalFileFile.Write($ReadBuffer,0,$ReadLength)
}
while ($ReadLength -ne 0)
$LocalFileFile.Close()

#Update the Last Modified DateTime
$(Get-Item $LocalFile).LastWriteTime=$RemoteLastModifiedTime
  

Комментарии:

1. Я протестировал ваш скрипт, и он работает при изменении времени; но у меня всегда размер 0 байт, Почему??

2. @Hackoo, спасибо, что указал на это. Я извлекал временную метку только из первой версии скрипта. Я загрузил его, чтобы выполнить два запроса 1. Получить временную метку удаленного файла 2. Загрузить файл 3. Применить временную метку к загруженному файлу

3. Я думал об этом способе, но у меня есть одна проблема с ним. GetDateTimestamp возвращается ко мне 20 апреля 2020 года в 13:36:00, но когда я проверяю этот файл в проводнике, я вижу 20 апреля 2020 года в 3:36:00. Как я могу получить правильное время (3: 36: 00) для файла? У меня есть код на VBScript, который может скопировать файл с ftp с исходным временем (3: 36:00), но я думаю, что Posh тоже может это сделать.

4. В зависимости от часового пояса, в котором вы находитесь, время, возвращаемое для этого файла, может отличаться. В моем случае я получаю понедельник, 20 апреля 2020 года, 12:36:00 вечера.

5. Я понимаю, что это зависит от часового пояса. Но как получить исходное время? Проводник каким-то образом может видеть ровно 3:36:00 …