Páginas

viernes, 16 de marzo de 2012

Copiar un archivo que está en uso por otro proceso


El siguiente procedimiento solo funciona en MS Windows.

No hay mucho que decir al respecto, si has llegado aquí es porque seguramente estás intentando copiar un archivo y sale un mensaje diciendo que el archivo está siendo utilizado por otro programa, he aquí la solución:

Lo primero que debes hacer es instalar este programa: VSHADOW, sirve para realizar copias en casos especiales como este.

Cuando finalice la instalación busquen en:
C:\Archivos de programa\Microsoft\VSSSDK72\Tools\VSSReports
que efectivamente exista el archivo: vshadow.exe, si es así, agreguen esa ruta al PATH. (El cómo se agrega la ruta al PATH no es un tema de este artículo).

Dado que este programa funciona por linea de comandos, puede resultar bastante tedioso y complejo de entender ya que tiene muchas opciones, por esta razón aquí les dejo un pequeño script que nos facilitará la vida. (Seguramente habrán encontrado un script parecido a este en otros sitios, para mi desgracia ninguno me funcionó, así que este tiene una leve modificación mía con la cual funcionó perfectamente, aún así no me hago responsable de los resultados).
Descargar script
  1. Copienlo en cualquier parte y cambien la extensión del archivo (solo hay que quitar los parentesis y listo)
  2. Abran la linea de comandos. Ejecuten el cmd.exe como administrador (Windows Vista y 7)
  3. Luego desde la linea de comandos vayan a la carpeta donde está ubicado el script y observen el siguiente comando:
copyshadow origen destino
Evidentemente origen se refiere a la ubicación del archivo que desean copiar y destino la ruta donde desean copiarlo, recomiendo que escriban estas rutas entre comillas para evitar errores.

Una vez escrito las rutas ejecútenlo y el archivo debe copiarse sin problemas.

Saludos.

domingo, 22 de enero de 2012

Convertir std::string a UTF-8 en C++

Hace tiempo tenía esta entrada pendiente la cual realmente debería llamarse:
Convertir de ISO-8859-1 a UTF-8
pero cuestiones de legibilidad le puse así.. les juro que de este tema solo encontré una página y está en coreano!... puede ser por dos razones, soy pésimo usando Google, o definitivamente no hay más información... aclaro que no tengo idea de coreano, pero si entiendo C++, así que me dí a la tarea de comprender un poco el código y ya lo tengo!...

Ahora, se estarán preguntando porque rayos yo necesitaría codificar un std::string a utf8 y la razón es que estoy construyendo un programa que envía información a un sitio web y si quiero enviar caracteres especiales como: áéíóúü y ñ ... y que se vean correctamente entonces debo enviarlos con esta codificación, así que gasté muchas horas leyendo y tratando de comprender el tema... y como lo he conseguido.. entonces les comparto el trozo de código en C++ (realmente parece código en C, pero al utilizar std::string asumo que es C++) que realiza esta conversión:

#include <iconv.h>

bool toUtf8(const string& in, string& out)
{
 iconv_t cd;
 bool ret = false;
 const char* pszIn;
 char* pszOut, *pos;
 size_t inLen, outLen;
 pszOut=NULL;
 
 cd = iconv_open("UTF-8","ISO-8859-1");
 
 if(cd == (iconv_t) -1)
 {
  return false; 
 }
 
 inLen = in.length();
 pszIn = in.c_str();
 
 outLen = (inLen+1) * 2;
 pos = pszOut = (char*)calloc(outLen, sizeof(char));
 
 if(!pszOut) goto clean; 
 if(iconv(cd, &pszIn, &inLen, &pos, &outLen)==-1) goto clean;
 
 out = pszOut;
 ret = true;
 
 clean:
  iconv_close(cd); 
 if(pszOut) free(pszOut);
 
 return ret;
}

Su uso es bastante simple: in es la que quieren convertir y out la cadena donde va a quedar el resultado.. el primer parámetro debe ser const pero el segundo es un paso por referencia donde se almacena el resultado así que no debe ser constante... algúnos expertos querrán matarme por uso del goto ... bueno, yo se que es un pecado usar esa instrucción, sin duda se puede evitar separando el ultimo proceso en otra función, pero por cuestiones prácticas lo he dejado allí, tal como lo encontré...

Presten atención especial a la línea:
iconv_open("UTF-8","ISO-8859-1");
Significa dos cosas, la primera que deben compilar la librería iconv y enlazarla a su proyecto, la librería se puede compilar en Windows con MSYS o en linux como supongo que saben hacerlo... creo que ese sería un tema para otra entrada :) ... allí en la página de descarga también encontrarán las diferentes codificaciones permitidas, como deben suponer ISO-8859-1 es para el español.

Espero que les sirva..

Éxitos!