usando copy folde con lua, solicito ayuda

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola a todos
Estoy intentando usar una forma de copiar archivos que sirvan incluso para archivos grandes con lua puro. Primero lo hice para un solo archivo luego modifiqué el script para copiar multiples archivos desde una carpetas con subcarpetas y archivos en ellos. El problema es que me da error en un dialogo que dice:

"Error attempt to index local "flnHandle" (a nil value)
Stack traceback:
1:[Page1-->Button1-->OnClick] Line: 46 in main chunk

Este es el codigo que estoy usando:

Código: Seleccionar todo


local source = Dialog.FolderBrowse("", _SourceFolder);
if source ~= "CANCEL" then

	sFolderpath = Dialog.FolderBrowse("Please select a destination:", _DesktopFolder);


	strSource = File.Find(source.."\\", "*.*", true, true, nil, nil);
	for xd, data in pairs (strSource) do
	tPathparts = String.SplitPath(data);	
	sFilename = tPathparts.Filename .. tPathparts.Extension;


		if sFolderpath ~= "CANCEL" then
		local destination = sFolderpath .. "\\" .. sFilename;
				
    	
			local BUFSIZE = 2^14;
			local fInHandle = io.open(data, "rb");
			local fOutHandle = io.open(destination, "wb");
			local size = File.GetSize(data);
			local blocks = Math.Floor(size / BUFSIZE);
			local remainder = size - (blocks * BUFSIZE);
			
			StatusDlg.Show();
			StatusDlg.SetMeterRange(0, 1000);
			StatusDlg.SetMeterPos(0);
			StatusDlg.SetMessage(data);		
			start = os.time();
		
			for i = 1, blocks do
  				data = fInHandle:read(BUFSIZE);
  				fOutHandle:write(data);
  				pos = 1000 * i * BUFSIZE / size;
  				StatusDlg.SetMeterPos(pos);
 		 		x = string.format("%0.1f%% copied", pos/10);
  				StatusDlg.SetStatusText(x);
			end

			if (remainder > 0) then
  				data = fInHandle:read(remainder);
  				fOutHandle:write(data);
			end

			[b][color=#BF0000]fInHandle:close();[/color][/b]
			fOutHandle:close();
			stop = os.time();
			StatusDlg.Hide();
			Label.SetText("results_of", "Results of: Test 2");
			Input.SetText("file_size", "File size: " .. size .. " bytes");
			Input.SetText("copy_time", "Lua I/O took " .. (stop-start) .. " seconds");

		end
	end

end
Parece ser que funciona como una tabla, pero como accedo a ella? o como lo resuelvo?

Código: Seleccionar todo

[b][color=#BF0000]fInHandle:close();[/color][/b]
to

Código: Seleccionar todo

fInHandle:close();
NicolasG escribió:
14 Dic 2021 20:08

Código: Seleccionar todo

[b][color=#BF0000]fInHandle:close();[/color][/b]
to

Código: Seleccionar todo

fInHandle:close();
perdone usted, quitando lo del tag code el resto parece lo mismo, que es lo que quieres decirme?
follacabras escribió:
14 Dic 2021 20:38
NicolasG escribió:
14 Dic 2021 20:08

Código: Seleccionar todo

[b][color=#BF0000]fInHandle:close();[/color][/b]
to

Código: Seleccionar todo

fInHandle:close();
perdone usted, quitando lo del tag code el resto parece lo mismo, que es lo que quieres decirme?
Perdón, fallo el pulmotor de mi abuela. En principio este código sirve para copiar archivos, pero intentas copiar tanto archivos como carpetas, sin ejecutar el código es ams estoy casi seguro que intenta copiar las carpetas y falla por ese motivo...
código de un proyecto viejo

Código: Seleccionar todo

WorkingFolder = "C:\\Users\\usuario\\Documents\\AutoPlay Media Studio 8\\Projects\\My Project\\CD_Root\\"
TempFolder = "C:\\Users\\usuario\\Downloads\\Nueva carpeta\\"

files = File.Find(WorkingFolder, "*.*", true, true, nil, nil);

for _, PathT in pairs(files) do
		local RawPath	= (PathT);
		local Path		= String.Replace(RawPath, WorkingFolder, "", true);
		local Split		= String.SplitPath(TempFolder.."\\"..Path);
		
		if(Split.Extension == "")then--FOLDER
			local BuildingPath = (TempFolder);
			
			for _, FolderName in pairs(DelimitedToTable(Path, "\\")) do
				Folder.Create(BuildingPath.."\\"..FolderName);
				BuildingPath = (BuildingPath.."\\"..FolderName);
			end
		else---------------------------FILE
			if(Folder.DoesExist(Split.Drive..Split.Folder))then
				File.Copy(RawPath, TempFolder..Path, true, true, false, true, nil);
			else
				local BuildingPath = (TempFolder);
				
				for _, FolderName in pairs(DelimitedToTable(String.Replace(Path, "\\"..Split.Filename..Split.Extension, "", true), "\\")) do
					Folder.Create(BuildingPath.."\\"..FolderName);
					BuildingPath = (BuildingPath.."\\"..FolderName);
				end
					
			if(Folder.DoesExist(Split.Drive..Split.Folder))then
				File.Copy(RawPath, TempFolder..Path, true, true, false, true, nil);
			end
		end
	end
end
El modo de diferenciar entre archivos y carpetas es ampliamente mejorable, supongo que usando pure lua/lfs se puede obtener un resultado mejor, pero que funciona, funciona. :poo-1413932426:
Holas NIco
pulmotor de la abuela... XD
El codigo ese si funciona un pelin lento pero va, estoy intentando con la opcion cancel probar que se cancele la copia pero al parecer al cancelar el proceso de copiado salta al siguiente archivo. De que manera es mejor provocar que se cancele totalmente el copiado?
ya esta, gracias NIco aqui esta el code por si alguien quiere ya resuelto..

Código: Seleccionar todo


local SourceFolder = Dialog.FolderBrowse("", _SourceFolder);
local DestFolder = Dialog.FolderBrowse("dest", _SourceFolder);


files = File.Find(SourceFolder.."\\", "*.*", true, true, nil, nil);
n = 0;--contador
for _, PathT in pairs(files) do
		local RawPath	= (PathT);
		local Path		= String.Replace(RawPath, SourceFolder, "", true);
		local Split		= String.SplitPath(DestFolder.."\\"..Path);
			
			StatusDlg.Show();
			StatusDlg.ShowCancelButton(true, "Cancel");			
			StatusDlg.SetMeterRange(0, #files);
			StatusDlg.SetMeterPos(n);
			--StatusDlg.SetMessage(Split.Filename..Split.Extension);
					
		if(Split.Extension == "")then--FOLDER
			local BuildingPath = (DestFolder);
			
			for _, FolderName in pairs(DelimitedStringToTable(Path, "\\")) do
				Folder.Create(BuildingPath.."\\"..FolderName);
				BuildingPath = (BuildingPath.."\\"..FolderName);
			end
		else---------------------------FILE
			if(Folder.DoesExist(Split.Drive..Split.Folder))then
				File.Copy(RawPath, DestFolder..Path, true, true, false, true, nil);
			else
				local BuildingPath = (DestFolder);
				
				for _, FolderName in pairs(DelimitedStringToTable(String.Replace(Path, "\\"..Split.Filename..Split.Extension, "", true), "\\")) do
					Folder.Create(BuildingPath.."\\"..FolderName);
					BuildingPath = (BuildingPath.."\\"..FolderName);
				end

		end
		n = n+1;
		haCancelado = StatusDlg.IsCancelled(); 
		if haCancelado == true then
			break;  -- corta el rollo
		end	
			
	end
end
StatusDlg.Hide();

gracias de nuevo....