Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Conflicto con archivos (https://www.clubdelphi.com/foros/showthread.php?t=84226)

danielmj 23-09-2013 14:59:06

Conflicto con archivos
 
Hola, estoy teniendo un problema a la hora de seleccionar un archivo en la aplicacion, me explico. Si pulso el boton "x" para abrir el explorador y seleccionar un archivo, lo selecciono y una vez tengo el nombre del archivo en un edit, vuelvo a repetir los mismos pasos pero con otro archivo y seguidamente vuelvo a seleccionar el archivo anterior (con lo que el edit vuelve a mostrar el archivo seleccionado la primera vez), la aplicacion me devuelve el mensaje "el archivo ya esta en uso por otra aplicacion".

En resumen..

1º pulso el boton abrir
2º selecciono un archivo "x"
3º en un edit aparece el nombre del archivo "x"
4º pulso el boton abrir
5º selecciono un archivo "y"
6º en el mismo edit aparece el nombre del archivo "y" borrando el nombre del anterior
7º vuelvo a pulsar el boton abrir
8º selecciono el mismo archivo "x"
9º la aplicacion muestra el mensaje "archivo en uso..." y no me deja seleccionarlo, cuando en realidad el ultimo archivo fue el "y"

¿Existe alguna forma o metodo de quitar de memoria un archivo previamente seleccionado al actual?

Esto digamos que se repite una y otra vez, por ejemplo si selecciono un nuevo archivo llamado "z", y luego quiero seleccionar el "x" o el "y", no me deja por que supuestamente ambos estan siendo usados.

Espero que alguien tenga alguna idea y pueda ayudarme. Gracias y un saludo.

oscarac 23-09-2013 16:47:47

puedes colocar el codigo?
lo abres para editarlo?, leerlo? grabarlo?

danielmj 23-09-2013 18:11:12

El código sería este:

Código Delphi [-]
procedure TPrincipal.SpeedButton1Click(Sender: TObject);
var
  hdl: THandle;
  FileData: TWin32FindData;
  Size:int64;

begin
  if FileOpen.Execute then
  Size := 0;
  hdl := FindFirstFile(PChar(FileOpen.FileName), FileData);
  if (hdl <> INVALID_HANDLE_VALUE) then
  begin
    Int64Rec(Size).Lo := FileData.nFileSizeLow;
    Int64Rec(Size).Hi := FileData.nFileSizeHigh;
  end;

  ConvertFileSizes(Size);
  labEdit1.Text:= FileOpen.FileName;
//  label4.Caption:= extractFileName(fileOpen.FileName);
end;


El archivo se abre (desde otro proceso) para lectura. La verdad es que no consigo avanzar mas por culpa de esto y me tiene :confused::mad:
Gracias y un saludo.

Neftali [Germán.Estévez] 25-09-2013 16:53:01

Según el código que has puesto no parece haber error.
Salvo en la función ConvertFileSizes (que he tenido que desactivar).

¿Puedes ejecutar paso a paso y ver dónde se produce el error?

Neeruu 25-09-2013 18:00:14

Para mi que estas abriendo el archivo...

1 - Prueba a seleccionar el archivo "X".
2 - Volver a seleccionar el archivo "X".

Si estoy en lo cierto el error se producirá...
Si es así deberías ver si no debes hacer un close al archivo antes de salir del procedimiento.


P/D: Probé tu código y a excepción de ConvertFileSizes(Size) que supongo es una función propia no genera ningún Error...


Saludos...

danielmj 25-09-2013 18:24:52

Hola, si es cierto abro 2 veces el archivo "X" pero entre estas dos veces abro el archivo "Y", es decir, la secuencia seria esta: "x" --> "y" --> "x" con lo cual al abrir "y" no deberia darme error al intentar abrir "x" ¿no? con tanta x e y es un lio, espero estar explicandome bien.

saludos y gracias.

ecfisa 26-09-2013 04:32:56

Cita:

Empezado por danielmj (Mensaje 467351)
Hola, si es cierto abro 2 veces el archivo "X" pero entre estas dos veces abro el archivo "Y", es decir, la secuencia seria esta: "x" --> "y" --> "x" con lo cual al abrir "y" no deberia darme error al intentar abrir "x" ¿no? con tanta x e y es un lio, espero estar explicandome bien.

saludos y gracias.

Hola danielmj.

Tál como te mencionó Neftalí el código que se visualiza no tendría que dar ese error.

Si limitas el código a:
Código Delphi [-]
...
var
  hdl: THandle;
  FileData: TWin32FindData;
  Size:int64;
begin
  with OpenDialog1 do
    if Execute then
    begin
      Size := 0;
      hdl  := FindFirstFile(PChar(FileName), FileData);
      if (hdl <> INVALID_HANDLE_VALUE) then
      begin
        Int64Rec(Size).Lo := FileData.nFileSizeLow;
        Int64Rec(Size).Hi := FileData.nFileSizeHigh;
      end;
      LabeledEdit1.Text := FileName;
    end;
end;
verás que te cansas de seleccionar alternadamente dos archivos sin que se produzca la situación que mencionas.

También coincido con Neeruu que pareciera que en otro punto del programa estas abriendo el archivo seleccionado sin cerrarlo. ¿ En la función ConvertFileSizes tal vez ?

Saludos :)

mamcx 26-09-2013 04:41:51

Eso es API de windows. Revisa:

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Estas obteniendo un handle y no lo estas liberando.

danielmj 26-09-2013 16:50:16

Buenas a todos, ya lo he arreglado! me ha costao verlo macho!! mamcx con el handle cerrado seguí fallando, lo que pasaba es que en otro procedimiento hacía una llamada al mismo archivo, pero de otro modo, entonces claro por un lado estaba cerrado pero por otro seguí abierto y este estado ultimo es el que llevaba la voz cantante.

en ese otro procedimiento tenía estas lineas:

Código Delphi [-]
FileQ := TFileStream.Create( FileName, fmOpenRead);
label12.Caption:= IntToStr(FileQ.Size);

y por eso fallaba, tan solo tenía que poner "FileQ.Destroy" y ya va pegando tiros!!

Gracias a todos por vuestros aportes! ahora a ver que nueva pega sale.
Saludos.


La franja horaria es GMT +2. Ahora son las 08:25:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi