<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Последние сообщения темы "Функция os.copy(source, destantion)"]]></title>
		<link>http://www.lua.ru/forum/posts/list/1.page</link>
		<description><![CDATA[Последние сообщения, отправленные в тему "Функция os.copy(source, destantion)"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ C удивлением обнаружил что такая необходимая функция в Lua отсутсвует.<br /> Написал свою:<br /> [code]local function os_copy (source_path, dest_path)<br /> 	local source = io.open(source_path)<br /> 	local dest = io.output(dest_path)<br /> 	dest:write(source:read("*a"))<br /> 	source:close()<br /> 	dest:close()<br /> end[/code]<br /> Работает :)<br /> Только подумалось мне что наверняка этот вопрос при лучшем знании Lua можно решить элегантнее  :?:<br /> [i](Условие одно: используем только стандартные возможности Lua)[/i]]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/665.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/665.page</link>
				<pubDate><![CDATA[Thu, 15 May 2008 23:19:08]]> GMT</pubDate>
				<author><![CDATA[ mozers™]]></author>
			</item>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [code]local function os_copy (source_path, dest_path)<br />   os.execute('copy "' .. source_path .. '" "' .. dest_path .. '"')<br /> end[/code]Для Linux и ему подобных: вместо "copy" подставить "cp" (и возможно, поменять местами одинарные и двойные кавычки).]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/666.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/666.page</link>
				<pubDate><![CDATA[Thu, 15 May 2008 23:57:34]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ Ну да, конечно есть os.execute с помощью которой можно сделать все что может ОС.<br /> Вариант принимается.<br /> Но я как то недолюбливаю ее примитивную реализацию с мигающим окном консоли, поэтому от такого варианта отказался сразу.<br /> А варианты решения без os.execute есть?<br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/667.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/667.page</link>
				<pubDate><![CDATA[Fri, 16 May 2008 08:34:17]]> GMT</pubDate>
				<author><![CDATA[ mozers™]]></author>
			</item>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [quote=mozers™]А варианты решения без os.execute есть?[/quote]<br /> Кроме вышеприведенных двух, есть вариант использования дополнительных библиотек для Lua. Например, я пользуюсь (неопубликованной) библиотекой SysUtils, которая содержит функцию sysutils.CopyFile.]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/668.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/668.page</link>
				<pubDate><![CDATA[Fri, 16 May 2008 11:11:26]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ 2[b]smz[/b]<br /> Не... Внешние библиотеки - это уже нарушение условий задачи.<br /> Я просто думал что мой код можно переписать более благообразно...<br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/669.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/669.page</link>
				<pubDate><![CDATA[Fri, 16 May 2008 13:20:07]]> GMT</pubDate>
				<author><![CDATA[ mozers™]]></author>
			</item>
			<item>
				<title>Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [quote=mozers™]2[b]smz[/b]<br /> Я просто думал что мой код можно переписать более благообразно...<br /> [/quote]Пожалуйста. Здесь починены 2 проблемы из 3-х имеющихся в оригинале. Третья - то что входной файл читается сразу целиком - это будет проблемой для файлов размером в несколько гигабайтов. Но это уже оставлено как упражнение для автора.<br /> [code]function os_copy (source_path, dest_path)<br /> 	local source = io.open(source_path, "rb")<br /> 	local dest = io.open(dest_path, "wb")<br /> 	dest:write(source:read("*a"))<br /> 	source:close()<br /> 	dest:close()<br /> end<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/670.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/670.page</link>
				<pubDate><![CDATA[Fri, 16 May 2008 14:36:07]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [code]function os_copy (source_path, dest_path)  <br />  io.output(dest_path):write( io.open(source_path):read("*a"))  <br /> end  [/code]<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/679.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/679.page</link>
				<pubDate><![CDATA[Mon, 19 May 2008 18:34:33]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [quote=__Alexey__][code]function os_copy (source_path, dest_path)  <br />  io.output(dest_path):write( io.open(source_path):read("*a"))  <br /> end  [/code][/quote]<br /> Здесь присутствуют все 3 дефекта, имеющиеся в оригинальной версии [b]mozers™[/b]<br /> А в дополнение - ещё один: на выходе из ф-ции не восстановлено прежнее значение io.output.]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/680.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/680.page</link>
				<pubDate><![CDATA[Mon, 19 May 2008 19:30:15]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ Зато 1 строка.]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/681.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/681.page</link>
				<pubDate><![CDATA[Mon, 19 May 2008 22:08:35]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [code]<br /> function os_copy (src_path, dst_path)  <br /> 	<br /> 	local src_file = io.open(src_path, 'rb')<br /> 	local dst_file = io.open(dst_path, 'wb')<br /> 	if not src_file then<br /> 		error('Cannot open source file "' .. src_path .. '"')<br /> 	end<br /> 	if not src_file then<br /> 		error('Cannot open destination file "' .. dst_path .. '"')<br /> 	end<br /> 	local buffer<br /> 	local buffer_size = 1024<br /> 	while true do<br /> 		buffer = src_file:read(buffer_size)<br /> 		if buffer then<br /> 			dst_file:write(buffer)<br /> 		else<br /> 			break<br /> 		end<br /> 	end<br /> 	src_file:close()<br /> 	dst_file:close()<br /> <br /> end<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/682.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/682.page</link>
				<pubDate><![CDATA[Mon, 19 May 2008 22:26:22]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [b]__Alexey__[/b]<br /> Уже лучше, если не считать небрежности. Вот твоя ф-ция с поправками:<br /> [code]function os_copy (src_path, dst_path)<br />   local src_file = io.open(src_path, 'rb')<br />   if not src_file then<br />     error('Cannot open source file "' .. src_path .. '"')<br />   end<br />   local dst_file = io.open(dst_path, 'wb')<br />   if not dst_file then<br />     src_file:close()<br />     error('Cannot open destination file "' .. dst_path .. '"')<br />   end<br />   local buffer_size = 0x10000<br />   local buffer = src_file:read(buffer_size)<br />   while buffer do<br />     dst_file:write(buffer)<br />     buffer = src_file:read(buffer_size)<br />   end<br />   dst_file:close()<br />   src_file:close()<br /> end<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/683.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/683.page</link>
				<pubDate><![CDATA[Mon, 19 May 2008 23:32:53]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ Нет смысла увеличивать буфер.<br /> Для проверки на вашем железе:<br /> <br /> [code]<br /> function os_copy (src_path, dst_path, buffer_size)<br /> <br /> 	local src_file = io.open(src_path, 'rb')  <br /> 	if not src_file then  <br /> 		error('Cannot open source file "' .. src_path .. '"')  <br /> 	end  <br /> 	local dst_file = io.open(dst_path, 'wb')  <br /> 	if not dst_file then  <br /> 		src_file:close()  <br /> 		error('Cannot open destination file "' .. dst_path .. '"')  <br /> 	end  <br /> 	if not buffer_size  then buffer_size = 2048 end<br /> 	local buffer = src_file:read(buffer_size)  <br /> 	while buffer do  <br /> 		dst_file:write(buffer)  <br /> 		buffer = src_file:read(buffer_size)  <br /> 	end  <br /> 	dst_file:close()  <br /> 	src_file:close()  <br /> end<br />  <br /> src_path = "test_file"<br /> dst_path = "test_file.out"<br /> <br /> for i=4, 16 do<br /> 	local start = os.clock()<br /> 	os_copy (src_path, dst_path, 2^i)<br /> 	print(i, os.clock() - start) <br /> end <br /> [/code]<br /> <br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/684.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/684.page</link>
				<pubDate><![CDATA[Tue, 20 May 2008 15:19:46]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [quote=__Alexey__]Нет смысла увеличивать буфер.<br /> Для проверки на вашем железе:[/quote]<br /> Проверка на моём железе дала оптимальный буфер в размере 8 KB. Но это для меня бесполезные данные, т.к. я не копирую файлы подобными функциями. Пользуюсь либо библиотекой на Си, либо os.execute.<br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/685.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/685.page</link>
				<pubDate><![CDATA[Tue, 20 May 2008 16:13:35]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ Сильно медленней, чем библиотечная функция (на С)?<br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/686.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/686.page</link>
				<pubDate><![CDATA[Tue, 20 May 2008 23:00:13]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ [quote=__Alexey__]Сильно медленней, чем библиотечная функция (на С)?<br /> [/quote]Библиотечная функция, которую я имел в виду - это просто обёртка вокруг CopyFile из Windows API. К моему удивлению, её скорость при копировании больших файлов практически та же, что и у вышеприведенных Lua функций. Но тут дело не в скорости: просто предпочитаю пользоваться стандартной функцией, а не изобретать велосипед.<br /> ]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/687.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/687.page</link>
				<pubDate><![CDATA[Wed, 21 May 2008 00:41:58]]> GMT</pubDate>
				<author><![CDATA[ smz]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ mozers поставил вопрос так, что использовать CopyFile нельзя. <br /> Полагаю, ему нужна совместимость без лишних проблем для разных платформ (WIN & GTK & ...) для SciTE.<br /> Для большей схожестью с CopyFile можно добавить проверку на перезапись существующего файла.<br /> <br /> К сожалению, решение получилось не элегантное.]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/698.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/698.page</link>
				<pubDate><![CDATA[Wed, 21 May 2008 11:09:15]]> GMT</pubDate>
				<author><![CDATA[ __Alexey__]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ Практически все приведенные здесь функции во первых "глотают" ошибки, которые в io выглядят как nil+message, во-вторых небезопасны в смысле исключений.<br /> Например:<br /> [code]<br /> --// for tracing:<br /> local fmt = getmetatable(io.stdout)<br /> local file_close = fmt.close<br /> function fmt:close()<br />   io.stderr:write(tostring(self),' closed\n')<br />   file_close(self)<br /> end<br /> <br /> local file_open = io.open<br /> function io.open(a,b)<br />   local f = file_open(a,b)<br />   io.stderr:write(tostring(f),' opened\n')<br />   return f<br /> end<br /> --//---------------------------------------------<br /> function os_copy (source_path, dest_path)  <br />     local source = io.open(source_path, "rb")<br />     local dest = io.open(dest_path, "wb")<br />     dest:write(source:read("*a"))<br />     source:close()  <br />     dest:close()  <br /> end<br /> <br /> --// Test:<br /> os_copy("1.gz","11.gz")<br /> [/code]<br /> [code]<br /> file (781C1BD8) opened<br /> file (781C1BF8) opened<br /> file (781C1BD8) closed<br /> file (781C1BF8) closed<br /> [/code]<br /> Теперь, например, сделаем 11.gz read-only:<br /> [code]<br /> file (781C1BD8) opened<br /> nil opened<br /> c:\Dev\lua\msvc8\bin\lua5.1.exe: copy.lua:39: attempt to index local 'dest' (a nil value)<br /> stack traceback:<br /> 	copy.lua:39: in function 'os_copy'<br /> 	copy.lua:52: in main chunk<br /> 	[C]: ?<br /> [/code]<br /> ... т.е. первый файл остался открытым до тех пор, пока его не соберет сборщик мусора, так-как исключение не дало вызвать source:close().<br /> <br /> Про один из подходов к безопасной работой с ресурсами можно почитать тут: http://lua-users.org/wiki/FinalizedExceptions - Диего Нехаб пишет как он сделал в luasocket.<br /> <br /> Я обычно пользуюсь похожим, но более общим (который подходит для Лиспа, Скалы, SML и вообще для любого язака с функциями высших порядков) способом.<br /> [code]<br /> --// "библиотечная" функция<br /> local function unwind_protect(thunk,cleanup)<br />   local ok,res = pcall(thunk)<br />   if cleanup then cleanup() end<br />   if not ok then error(res,0) else return res end<br /> end<br /> --// общая функция для работы с открытыми файлами<br /> local function with_open_file(name,mode)<br />   return function(body)<br />            local f = assert(io.open(name,mode))<br />            return unwind_protect(function()return body(f) end,<br />                                  function()return f and f:close() end)<br />          end<br /> end<br /> --// собственно os-copy -- <br /> function os_copy2(source_path,dest_path)<br />   return with_open_file(source_path,"rb") (function(source)<br />     return with_open_file(dest_path,"wb") (function(dest)<br />       assert(dest:write(assert(source:read("*a"))))<br />       return 'copy ok'<br />     end)<br />   end)<br /> end<br /> --// Test: (11.gz -- read-only)<br /> print(pcall(function() return os_copy2("1.gz","11.gz") end))<br /> [/code]<br /> [code]<br /> false	copy2.lua:31: assertion failed!<br /> file (781C1BD8) opened<br /> nil opened<br /> file (781C1BD8) closed<br /> [/code]<br /> Когда все нормально (уберем read-only):<br /> [code]<br /> true	copy ok<br /> file (781C1BD8) opened<br /> file (781C1BF8) opened<br /> file (781C1BF8) closed<br /> file (781C1BD8) closed<br /> [/code]<br /> Т.е. все само вовремя закрывается, деструкторы вызываются в порядке, обратном вызову конструкторов. Синтаксис громоздкий, но это Луа :) В Scala, например, это выглядит намного изящнее:<br /> [code]<br /> // Scala:<br /> with_open_file(source_path,"wb"){ source =&gt;<br />     ...<br />     // Body<br /> }<br /> [/code]]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/704.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/704.page</link>
				<pubDate><![CDATA[Wed, 21 May 2008 21:03:29]]> GMT</pubDate>
				<author><![CDATA[ z00n]]></author>
			</item>
			<item>
				<title>Re:Функция os.copy(source, destantion)</title>
				<description><![CDATA[ 2[b]z00n[/b]<br /> Сильно  <img src="http://www.lua.ru/forum//images/smilies/9293feeb0183c67ea1ea8c52f0dbaf8c.gif" /><br /> Код профессионала сильно отличается от кода новичка - я нефига не понял как работают эти циклы - тупо скопировал все в свой скрипт.<br /> Стандартное решение os.execute("cmd /c copy "..source..destantion) этому и в подметки не годится!<br /> Скорость выполнения выросла более чем в 100 раз!!! (у меня непрерывно копируются маленькие файлы).<br /> Про то, что исчезло это, дико раздражающее, постоянно мигающее консольное окошко я уже не говорю...<br /> Браво, автор!]]></description>
				<guid isPermaLink="true">http://www.lua.ru/forum/posts/preList/89/816.page</guid>
				<link>http://www.lua.ru/forum/posts/preList/89/816.page</link>
				<pubDate><![CDATA[Sat, 14 Jun 2008 16:15:13]]> GMT</pubDate>
				<author><![CDATA[ mozers™]]></author>
			</item>
	</channel>
</rss>