Создайте путь назначения, используя Path.Combine () , когда путь составлен.
Многие известные системные местоположения имеют предопределенные значение в Environment.SpecialFolder : в вашем случае Environment.SpecialFolder.Desktop
. Environment.GetFolderPath () принимает одно из этих значений и возвращает правильный путь к файловой системе. Это возвращает путь к папке рабочего стола для текущего пользователя:
Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Объект Icon имеет метод Save () , который принимает Stream в качестве аргумента. Вы можете передать FileStream , чтобы сохранить значок в файл с сохранением его формата, или MemoryStream , а затем использовать File.WriteAllBytes () для сохранения MemoryStream's буфер, вызывающий свой метод ToArray()
.
Использование имени ресурса в виде строки с использованием ResourceManager.GetObject () :
Dim iconPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "myIcon.ico")
Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None),
ico = TryCast(My.Resources.ResourceManager.GetObject("myIcon"), Icon)
ico?.Save(stream)
End Using
Или, в зависимости от того, что лучше подходит в контексте ваших операций:
Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None)
My.Resources.myIcon.Save(stream)
End Using
GC.Collect()
Примечание: здесь я звоню GC.Collect()
после звонка Save()
непосредственно на объекте Icon, созданном My.Resources
. Документы точно не объясняют это: My.Resources
- это фабрика, она не возвращает объект, хранящийся в ресурсах проекта , она генерирует новый объект (каждый раз другой) из данных хранится как ресурс. С помощью My.Resources.myIcon.Save(stream)
мы создаем новый объект, сохраняем его данные на c, но никогда не удаляем его. При вызове GC.Collect()
сразу после этого используемая память немедленно восстанавливается. Если мы этого не сделаем, эта память никогда не будет восстановлена (мы утекаем ).
Вероятно, лучше назначить сгенерированный объект временной переменной, объявленной с помощью оператора Using
. Следующие два метода могут использовать GC.Collect()
, вызывая его сразу после, для немедленного освобождения выделенной памяти, но это не строго требуется, мы на самом деле не теряем ресурсы. Откройте Visual Studio Diagnostic Tools
, чтобы протестировать поведение с GC.Collect()
и без него, вызывая эти методы несколько раз.
Using stream As New FileStream(iconPath, FileMode.Create, FileAccess.Write, FileShare.None),
ico = My.Resources.myIcon
ico.Save(stream)
End Using
' GC.Collect() <= Not strictly required, but test the difference
Или используя MemoryStream:
Using ms As New MemoryStream(),
ico As Icon = My.Resources.myIcon
ico.Save(ms)
ms.Position = 0
File.WriteAllBytes(iconPath, ms.ToArray())
End Using
' GC.Collect() <= Not strictly required, but test the difference