параметр validateImageData и Изображение. FromStream ()

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

function Copy-Unique {
    # Copies files to a destination. If a file with the same name already exists in the destination,
    # the function will create a unique filename by appending '(x)' after the name, but before the extension. 
    # The 'x' is a numeric sequence value.
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

function Copy-1 {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

[111]

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$Source, [Parameter(Mandatory = $true, Position = 1)] [string]$Destination, [Parameter(Mandatory = $true, Position = 2)] [int]$Threshold, [string]$Filter = '*' ) # you are not showing this function, so I have to assume it does what it needs to do $remainingSpace = Get-FreeSpace if($remainingSpace -gt $Threshold) { Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose } else { $answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit." if ($answer -ne 'Q') { # you have cleared space, and want to redo the copy action Copy-1 -Source $Source -Destination $Destination -Filter $Filter } } }

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$SourceFolder, [Parameter(Mandatory = $true, Position = 1)] [string]$DestinationFolder, [Parameter(Mandatory = $false, Position = 2)] [string]$Filter = '*', [switch]$Recurse ) # create the destination path if it does not exist if (!(Test-Path -Path $DestinationFolder -PathType Container)) { Write-Verbose "Creating folder '$DestinationFolder'" New-Item -Path $DestinationFolder -ItemType 'Directory' -Force | Out-Null } # get a list of file FullNames in this source folder $sourceFiles = @(Get-ChildItem -Path $SourceFolder -Filter $Filter -File | Select-Object -ExpandProperty FullName) foreach ($file in $sourceFiles) { # split each filename into a basename and an extension variable $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file) $extension = [System.IO.Path]::GetExtension($file) # this includes the dot # get an array of all filenames (names only) of the files with a similar name already present in the destination folder $allFiles = @(Get-ChildItem $DestinationFolder -File -Filter "$baseName*$extension" | Select-Object -ExpandProperty Name) # for PowerShell version < 3.0 use this # $allFiles = @(Get-ChildItem $DestinationFolder -Filter "$baseName*$extension" | Where-Object { !(

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

function Copy-1 {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

[111]

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$Source, [Parameter(Mandatory = $true, Position = 1)] [string]$Destination, [Parameter(Mandatory = $true, Position = 2)] [int]$Threshold, [string]$Filter = '*' ) # you are not showing this function, so I have to assume it does what it needs to do $remainingSpace = Get-FreeSpace if($remainingSpace -gt $Threshold) { Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose } else { $answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit." if ($answer -ne 'Q') { # you have cleared space, and want to redo the copy action Copy-1 -Source $Source -Destination $Destination -Filter $Filter } } }

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

.PSIsContainer) } | Select-Object -ExpandProperty Name) # construct the new filename $newName = $baseName + $extension $count = 1 while ($allFiles -contains $newName) { $newName = "{0}({1}){2}" -f $baseName, $count, $extension $count++ } # use Join-Path to create a FullName for the file $newFile = Join-Path -Path $DestinationFolder -ChildPath $newName Write-Verbose "Copying '$file' as '$newFile'" Copy-Item -Path $file -Destination $newFile -Force } if ($Recurse) { # loop though each subfolder and call this function again Get-ChildItem -Path $SourceFolder -Directory | Select-Object -ExpandProperty Name | ForEach-Object { $newSource = (Join-Path -Path $SourceFolder -ChildPath

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

function Copy-1 {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

[111]

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$Source, [Parameter(Mandatory = $true, Position = 1)] [string]$Destination, [Parameter(Mandatory = $true, Position = 2)] [int]$Threshold, [string]$Filter = '*' ) # you are not showing this function, so I have to assume it does what it needs to do $remainingSpace = Get-FreeSpace if($remainingSpace -gt $Threshold) { Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose } else { $answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit." if ($answer -ne 'Q') { # you have cleared space, and want to redo the copy action Copy-1 -Source $Source -Destination $Destination -Filter $Filter } } }

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

) $newDestination = (Join-Path -Path $DestinationFolder -ChildPath

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

function Copy-1 {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

[111]

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$Source, [Parameter(Mandatory = $true, Position = 1)] [string]$Destination, [Parameter(Mandatory = $true, Position = 2)] [int]$Threshold, [string]$Filter = '*' ) # you are not showing this function, so I have to assume it does what it needs to do $remainingSpace = Get-FreeSpace if($remainingSpace -gt $Threshold) { Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose } else { $answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit." if ($answer -ne 'Q') { # you have cleared space, and want to redo the copy action Copy-1 -Source $Source -Destination $Destination -Filter $Filter } } }

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

) Copy-Unique -SourceFolder $newSource -DestinationFolder $newDestination -Filter $Filter -Recurse } } }

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

function Copy-1 {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias("Path")]
        [ValidateScript({Test-Path -Path 

Как комментирует Кори Гилл , я также не понимаю, почему вы хотите изменить расширения для файлов. Моя идея состоит в том, чтобы добавить порядковый номер в базовое имя файла, если целевой файл уже должен существовать.
Фактически, если вы попытаетесь вручную скопировать / вставить файл, который уже существует, Windows также предложит добавить порядковый номер в файл.

Для этого эта функция может оказаться полезной:

[110]

Я бы также предложил некоторые изменения в вашей функции Copy-1 для использования вышеуказанной функции Copy-Unique:

[111]

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

-PathType Container})] [string]$Source, [Parameter(Mandatory = $true, Position = 1)] [string]$Destination, [Parameter(Mandatory = $true, Position = 2)] [int]$Threshold, [string]$Filter = '*' ) # you are not showing this function, so I have to assume it does what it needs to do $remainingSpace = Get-FreeSpace if($remainingSpace -gt $Threshold) { Copy-Unique -SourceFolder $Source -DestinationFolder $Destination -Filter $Filter -Recurse -Verbose } else { $answer = Read-Host -Prompt "Remaining space is now $remainingSpace. Press 'Q' to quit." if ($answer -ne 'Q') { # you have cleared space, and want to redo the copy action Copy-1 -Source $Source -Destination $Destination -Filter $Filter } } }

и затем используйте его так:

Copy-1 -Source 'source\path' -Destination 'destination\path' -Threshold 100 -Filter '*.extension'
Copy-1 -Source 'source\path' -Destination 'some\other\destination\path' -Threshold 100 -Filter '*.another_extension'


ПРИМЕЧАНИЕ

Конечно, снова и снова запускать одни и те же параметры, вы получите много копий, потому что функция не сравнивает файлы на равенство. Если вы хотите выполнить настоящую синхронизацию папок, я предлагаю вам использовать для этого специальное программное обеспечение или использовать RoboCopy. Примеры синхронизации каталогов с использованием RoboCopy можно найти практически везде в Интернете, например, здесь

14
задан Peter Ritchie 24 July 2012 в 20:39
поделиться

4 ответа

От Отражателя мы видим:

if (validateImageData)
{
    num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero));
    if (num != 0)
    {
        SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero));
        throw SafeNativeMethods.Gdip.StatusException(num);
    }
}

Таким образом, мы видим, что GdipImageForceValidation называют (отзыв, Система. Рисунок является просто оберткой по GDI +). Документация для этой функции не очень хороша:

Эта функция вызывает проверку изображения.

Не очень полезный. Однако мнение высказано - файл изображения опрошен, чтобы гарантировать, что безопасно загрузиться. Это может заставить целое изображение быть загруженным в память.

Если бы Вы принимаете исходные данные от пользователей, я, конечно, установил бы этот флаг на истинный - Вы никогда не знаете, какие файлы (уродливый или иначе) пользователи загрузят.Береженого Бог бережет. Поэтому значение по умолчанию true.

Обратите внимание также, что GDI + не рекомендуется для серверных сред. Вы - более обеспеченное использование System.Windows.Media.Imaging.

14
ответ дан 1 December 2019 в 12:53
поделиться

Путем просматривания в отражателе Вы будете видеть, что.NET по умолчанию всегда называет встроенный API в библиотеках GDI + под названием GdipImageForceValidation (который является путем передачи верный для validateImageData параметра). Я не могу узнать много о встроенном API в MSDN, только это, которое говорит нам не больше, чем название самой функции. Однако кажется, что этот метод вызывает снижение производительности на основе сообщения Justin Roger о загрузке изображений самым быстрым способом через.NET. Это также интуитивно, чтобы ожидать, что любой шаг "проверки" отнял бы у производительности.

Однако при определении лжи для validateImageData параметра.NET явно инициирует неуправляемая безопасность кода спрос, означая, что авторы платформы решили, что принуждение проверки изображения было необходимо для создания обещания управляемого кода, являющегося безопасным, и в конечном счете способность доверять данным, которые, как вызывающая сторона говорит, представляют изображение. Таким образом, в то время как определение flase для validateImageData может увеличить производительность в less-than-full-trust контексте защиты, это может генерировать исключение, и необходимо доверять данным, Вы думаете, изображение.

5
ответ дан 1 December 2019 в 12:53
поделиться

Я не забываю читать некоторые проблемы с тем параметром. См. это сообщение (это довольно старо, но только быть осторожным).

2
ответ дан 1 December 2019 в 12:53
поделиться

Почему не только пытаются видеть то, что происходит с тем набором флага и не набором?

В любом случае необходимо обработать любые исключения, которые могли бы быть выданы.

0
ответ дан 1 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: