LINUX.ORG.RU
ФорумTalks

замена файла в винде.


0

2

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

Итак:

Если системный файл, который установщик пытается заменить, занят, то установщик перезаписывает его с опцией MOVEFILE_DELAY_UNTIL_REBOOT — чтобы занятый файл заменился при перезагрузке системы:

// Код упрощен для ясности MoveFileEx(«sysfile.new», «sysfile.dll», MOVEFILE_DELAY_UNTIL_REBOOT); CopyFile(«D:\\CDROM\\INSTALL\\sysfile.dll», «sysfile.new»);

---------------

Я плакалъ.

★★☆☆☆
Ответ на: комментарий от derlafff

>Жесть.

А разве в линуксе можно перезаписать открытый файл?

Конечно.

Просто старый файл будет существовать файтически, пока его использует уже запущенная программа, но в ФС его уже не будет видно. Поэтому заново запущенные программы будут получать уже новую версию файла. А старая окончательно рипнется в тот момент, когда последняя программа его использующая сделаеть fclose.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от derlafff

Можешь ради интереса попробовать

mplayer file1.avi

cp file2.avi file1.avi

mplayer file1.avi

dikiy ★★☆☆☆
() автор топика

Windows — УГ. И да, на винфак.

GotF ★★★★★
()
Ответ на: комментарий от yirk

>Зачем менять системный файл?

в оффтопике любая либа такая. Да и это к любым файлам относится.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от derlafff

Можно. Vfs ставит пометку о несуществуюшем файле. Новым программам он не будет доступен. А тем, что уже читают из файла, будет доступен пока не закроют.

hibou ★★★★★
()

Не по сабжу, но феерично:

Взято оттуда же
http://habrahabr.ru/blogs/Old_New_Thing/103598/

Редактор звуков и назойливый паразит

Нам попалась одна обучающая программа, паразитирующая на стандартном Редакторе звуков, и вцепившаяся в него так глубоко, что чем дальше мы её изучали, тем больше поражались.

Первая проблема была банальной: программа запускала Редактор звуков по имени его 16-битной версии, SOUNDREC.EXE. В Windows 95 Редактор звуков был 32-битным, и назывался SNDREC32.EXE — так же, как в Windows NT. Мы переименовали файл обратно в 16-битное имя, и полагали, что теперь программа заработает.

Но она не заработала. Успешно запустив редактор, программа ищет его окно по заголовку. Сначала она пробует найти английский заголовок, потом итальянский (программа разрабатывалась для итальянцев). Не так уж и плохо: многие разработчики вовсе не задумывались о поддержке локализованных выпусков Windows. Правда, итальянцы, живущие, скажем, во Франции, воспользоваться этой программой не смогут; но это не наша забота.
В Windows 95 заголовок Редактора звуков поменялся: мы добавили туда имя открытого файла. Теперь программа не могла найти окно редактора, который запустила.

Тогда мы поменяли заголовок 16-битного Редактора звуков, чтобы он в точности совпадал с заголовком, бывшим в Windows 3.1. Наконец-то программа запустилась. Мы проследили за ней, и обнаружили, что она никогда не пользуется запущенным редактором! Зачем же она его запускала?

Оказалось, в определённых условиях она им действительно пользуется. Обычно она проигрывает звуки при помощи специального компонента (видимо, это был VBX), который поддерживает асинхронные драйвера звуковых карт, но не поддерживает синхронный драйвер SPEAKER.DRV, позволявший на компьютерах без звуковой карты проигрывать звуки через спикер.
Разработчики искали что-нибудь, что сможет работать с этим синхронным драйвером, — и нашли Редактор звуков. Сымитировать нажатия клавиш в его окне — и готова дешёвая замена компоненту-проигрывателю.

Но если обратить внимание в момент запуска программы, можно заметить, как окно Редактора звуков мелькает и сразу же пропадает, оставив лишь полосочку слева экрана. Программисты не хотели, чтоб окно редактора было видно. Но они не знали, как сделать окно невидимым, поэтому они сделали всё, что было в их силах: «утащили» окно за пределы экрана. Ну, почти за пределы. Они не умели даже переместить окно программно, поэтому они имитировали клики и движения мыши, как будто перетаскивают окно за заголовок. Когда на экране остаётся только узкая полоска, которую мышью уже не утащить дальше влево, программисты считают свою задачу выполненной: «Мы убрали окно за экран — наверное, никто его не заметит.»

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от unC0Rr

>Не знал что ли?

Знал, но про существованию столь фееричного обхода не знал.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

>программисты считают свою задачу выполненной: «Мы убрали окно за экран — наверное, никто его не заметит.»

Уважаю Билли Гейтса и его корпорацию, это ж сколько инвалидов умственного труда они трудоустроили.

Attila ★★
()

Ох, это просто эпичнейшая статья.

pevzi ★★★★★
()
Ответ на: комментарий от Attila

>программисты считают свою задачу выполненной: «Мы убрали окно за экран — наверное, никто его не заметит.»

Уважаю Билли Гейтса и его корпорацию, это ж сколько инвалидов умственного труда они трудоустроили.


Бод linux они свой софт написали бы точно также

anonymoos ★★★★★
()

Вот из-за этой повышенной «заботы» об идиотах, выдумывания обходных решений, вместо того, чтоб идиотов научить, и возникают инструкции с «не сушить кошку в микроволновке». А потом на производителей микроволновки подаст в суд какое-нить неграмотное существо, которое читать не умело, и кошку, таки, просушило. В микроволновку вкрячат детектор кошек. Пока там не просушат собаку. В результате полученный агрегат будет делать всё, что угодно (и как угодно), кроме своей изначальной функции — подогреть ЖРАТ.

one_more_hokum ★★★
()

Я тоже плакалЪ

Спасибо.

На хабре, кстати, заминусовали человека, который написал:

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

ttnl ★★★★★
()

Ну да, из-за этого костыля все домохозяйки немедленно бросятся заменять Windows на Linux и поднимать имеющиеся принтеры, видеокарты, ТВ-тюнеры и т.д. и т.п.

PayableOnDeath
()
Ответ на: комментарий от anonymoos

А как выглядит бод Linux? Это какой-то особенный бод?

Deleted
()

Читаю хабровый тред, так этот amario прямо-таки молодец. Мартин Иден, интеллигент среди быдла.

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

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

unC0Rr ★★★★★
()

Угу. WinApi просто ужасен, если надо писать под окошки, лучше воспользуюсь дотнетом или огорожусь бустом если возможно

koirn
()
Ответ на: комментарий от Deleted

Т.е. если я не могу создать в винде два файла с названиями, отличающимися лишь тем, прописные или строчные буквы использованы, то это определённо баг? А если я не могу создать два файла с одинаковыми именами в линуксе?

unC0Rr ★★★★★
()
Ответ на: комментарий от koirn

> огорожусь бустом если возможно

буст - это модное словечко теперь такое?

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

>Т.е. если я не могу создать в винде два файла с названиями, отличающимися лишь тем, прописные или строчные буквы использованы, то это определённо баг?

Нет, это не баг. Но определенно ошибка в ДНК. Лишняя хромосома, понимаете ли.

ttnl ★★★★★
()
Ответ на: комментарий от anonymoos

>Бод linux они свой софт написали бы точно также

Под linux труд инвалидов не оплачивается и это сильно сказывается на их численности.

Attila ★★
()
Ответ на: комментарий от annoynimous

>Тонко! Обозвать оппонента дауном так, чтобы тот не догадался...

Ничего такого не имел в мыслях. Это не про оппонента, а про вендовую концепцию.

ttnl ★★★★★
()
Ответ на: комментарий от annoynimous

Где уж мне догадаться, что меня дауном обзывают, когда речь про ошибку в ДНК винды(или её создателя?)

unC0Rr ★★★★★
()
Ответ на: комментарий от ttnl

Да не, всё нормуль. Ту фразу очень постараться надо, чтобы воспринять как направленную на меня.

unC0Rr ★★★★★
()
Ответ на: комментарий от dikiy

>в оффтопике любая либа такая
ЩИТО?

Что касается MOVE_DELAY_UNTIL_REBOOT, то это в общем-то далеко не самый идиотский воркэраунд в условиях, когда файловая система ущербна.

proud_anon ★★★★★
()
Ответ на: комментарий от dikiy

Windows Way фигли. Если понадобиться написать программу работающую с теми же экселевскими файлами - придется извращаться подобным образом, либо долго и мучительно писать парсер.

Nebuchadnezzar ★★★★
()
Ответ на: комментарий от proud_anon

>в оффтопике любая либа такая
ЩИТО?

Флаг System не имеет никакого отношения к «системности». Да и что такое вообще «системный» файл в понятии оффтопика?

Что касается MOVE_DELAY_UNTIL_REBOOT, то это в общем-то далеко не самый идиотский воркэраунд в условиях, когда файловая система ущербна.


ФС тут ни причем.

Под линухом на fat можно с успехом проводить все то же самое.

aplay file1.wav &
cp file2.wav file1.wav
aplay file1.wav &

И оба процесса будут весело продолжать играть каждый свое.
ФС тут ни при чем. Тут ущербность глубже.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

>Флаг System не имеет никакого отношения к «системности».
Да, но, ЕМНИП, защита системных файлов защищает только файлы Windows, в семерке еще Program Files. Поскольку атрибут системный можно снять, и все.

DLL в Windows без него вполне работают.

Под линухом на fat можно с успехом проводить все то же самое.

А вот этого я не знал. Я думал, что этот функционал на более низком уровне работы с ФС. Это хорошо.

proud_anon ★★★★★
()
Ответ на: комментарий от unC0Rr

Какую часть во фразе «всем приходится обходить» ты не осилил?

Deleted
()
Ответ на: комментарий от dikiy

[quote]
Под линухом на fat можно с успехом проводить все то же самое.

aplay file1.wav &
cp file2.wav file1.wav
aplay file1.wav &

И оба процесса будут весело продолжать играть каждый свое.
[/quote]

Это преимущество или недостаток? А если не file1.wav, а file1.avi, который просто не влезет в память? Это просто разный подход. О преимуществах и недостатках трудно судить на примере file1.wav. Я, да и не только, видел видео с rm -rf / несколько (лет?) месяцев назад на ЛОРе. На видео ясно видно, как загибается убунту. Но вот если посмотреть под другм углом, то этого вообще бы не произошло, если бы нельзя было удалить «занятые» файлы. Наверное все-таки правильней не давать доступа на запись для файлов, которые используются в данный момент.

TGZ ★★★★
()
Ответ на: комментарий от TGZ

>Это преимущество или недостаток? А если не file1.wav, а file1.avi, который просто не влезет в память?

Да хоть facepalmg.bz2 (8tb). Какая разница? Оно ж не в ОЗУ лезет.

На видео ясно видно, как загибается убунту. Но вот если посмотреть под другм углом, то этого вообще бы не произошло, если бы нельзя было удалить «занятые» файлы.

А если бы не было компьютера, то и rm -rf нельзя было бы сделать. Ваш К.О.

Наверное все-таки правильней не давать доступа на запись для файлов, которые используются в данный момент.

Наверное в сад.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

Оно ж не в ОЗУ лезет


Тогда как «оно» возьмет данные из 1.avi на пару часов если ему сделали «cp»,«mv»,«>» или вообще «rm»?

TGZ ★★★★
()
Ответ на: комментарий от TGZ

>> Оно ж не в ОЗУ лезет

Тогда как «оно» возьмет данные из 1.avi на пару часов если ему сделали «cp»,«mv»,«>» или вообще «rm»?

facepalm.tar.bz2.lzma.lrz

оно выносит связь inode<->имя, что расновильно rm. Но пока inode не освободится (использующая файл программа не сделает fclose/закроет файл) на его место никто не претендует. RTFM короче.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от lodin

lodin> Ах вот откуда имена функций типа NotifyClientsEx берутся!!!
Да ладно, это фигня по сравнению с RtlWriteDecodedUcsDataIntoSmartLBlobUcsWritingContext или EapHostPeerQueryUIBlobFromInteractiveUIInputFields :-)

hdfan2
()
Ответ на: комментарий от dikiy

оно выносит связь inode<->имя, что расновильно rm. Но пока inode не освободится (использующая файл программа не сделает fclose/закроет файл) на его место никто не претендует.


Тогда почему у меня этого не получается? Запускаю `mplayer 1.avi; echo 123>1.avi`.

TGZ ★★★★
()

omfg. Только теперь я начинаю понимать, зачем нужно столько перезагрузок для установки VS 2010

annulen ★★★★★
()
Ответ на: комментарий от TGZ

>Тогда почему у меня этого не получается? Запускаю `mplayer 1.avi; echo 123>1.avi`.

Потому, что ты не читал man bash, lol.

Во вторых, перед тем как наступить на очередные грабли предупреждаю, что запустить mplayer в фоне не так-то и тривиально. проще сделай так:

запусти mplayer в одном терминале, а из другого сделай echo 123>1.avi

dikiy ★★☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.