Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   leer metadatos en un archivo (https://www.clubdelphi.com/foros/showthread.php?t=85497)

ebeltete 25-03-2014 13:45:22

leer metadatos en un archivo
 
Hola amigos del foro. Vuelvo para pedirles ayuda.
Con Delphi 5 estoy trabajando en una aplicacion para leer y escribir metadatos en un archivo, mas precisamente el IDTAG en archivos multimedia. En pricipio lo habia hecho con "TFileStream", pero de esta manera no podia acceder al archivo si estaba siendo usado por otra aplicacion, termine usando "AssignFile" que de esta manera no tengo problema si el archivo esta siendo usado por otro. Pero ahora me encuentro con el problema que cuando el archivo es de "solo lectura" me genera un error (acceso al archivo denegado). Como puedo hacer para no tener este problema? Gracias.

Neftali [Germán.Estévez] 25-03-2014 15:39:57

Cita:

Empezado por ebeltete (Mensaje 474314)
Pero ahora me encuentro con el problema que cuando el archivo es de "solo lectura" me genera un error (acceso al archivo denegado). Como puedo hacer para no tener este problema? Gracias.

El problema es que si el archivo lo está utilizando otra aplicación no depende de la tuya, sino de cómo lo haya abierto la ora aplicación antes que la tuya.
Estaría bien además que pusieras código para ver cómo estás abriendo el fichero.

Una opción podría ser la de dar la posibilidad de guardar una copia (igual que hacen otros programas) cuando el archivo está siendo utilizado por otra aplicación.

ebeltete 25-03-2014 17:06:31

esto es algo de lo que hago:
Código Delphi [-]
procedure TID3Tag.ReadTag;
var
  FTagRecord: ID3Struct;
        F:File;


begin

        AssignFile(F, FFileName);
        Reset(F,1);
        Seek(F,FileSize(F)-SizeOf(FTagRecord));
        BlockRead(F, FTagRecord, SizeOf(FTagRecord));
        CloseFile(F);

        if StrLComp(FTagRecord.Magic, ID3Magic, SizeOf(FTagRecord.Magic))<>0 then
  begin
                FillChar(FTagRecord, SizeOf(FTagRecord), ' ');
                StrLCopy(FTagRecord.Magic, ID3Magic, SizeOf(FTagRecord.Magic));
  end;

  with FTagRecord do
  begin


    FTitle := Trim(Copy(Title, 1, SizeOf(Title)));
    FArtist := Trim(Copy(Artist, 1, SizeOf(Artist)));
    FAlbum := Trim(Copy(Album, 1, SizeOf(Album)));
    FYear := Trim(Copy(Year, 1, SizeOf(Album)));
    FComment := Trim(Copy(Comment, 1, SizeOf(Comment)));
    FGenre := ID3GenreName[Genre];
  end;
Con respecto a que otra aplicacion lo use no es el problema, con AssignFile lo solucione, o sea por mas que otro usuario con otra aplicacion este usando el archivo (por ejemplo en un recurso compartido de red), mi aplicacion lo lee igual.
Ahora cuando el archivo tiene la propiedad "solo lectura" no lo puedo leer dese mi aplicacion.
Con respecto de hacer una copia no lo veo viable porque puede ser un archivo demasiado grande y tardaria demasiado en hacer la copia. Gracias

ecfisa 25-03-2014 19:35:43

Cita:

Empezado por ebeltete (Mensaje 474321)
...
Con respecto a que otra aplicacion lo use no es el problema, con AssignFile lo solucione, o sea por mas que otro usuario con otra aplicacion este usando el archivo (por ejemplo en un recurso compartido de red), mi aplicacion lo lee igual.
Ahora cuando el archivo tiene la propiedad "solo lectura" no lo puedo leer dese mi aplicacion.
Con respecto de hacer una copia no lo veo viable porque puede ser un archivo demasiado grande y tardaria demasiado en hacer la copia. Gracias

Hola ebeltete.

Opino igual que Neftali, depende de los atributos con haya abierto el archivo la otra aplicación. Si lo hizo omitiendo el modo FILE_SHARE_READ no lo vas a solucionar con AssignFile, cuya función es sólo asociar un nombre externo a una variable de archivo.

De todos modos, fijate si te puede servir el contenido de este enlace: Como leer ficheros de texto que estan siendo usados por otro proceso

Saludos :)

ebeltete 26-03-2014 16:43:12

Gracias por sus respuestas, logre hacerlo funcionar con "readfile" y "writefile" quedo algo asi:
Código Delphi [-]
 hFile := createfile(PChar(FFileName), GENERIC_READ or GENERIC_WRITE , FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
        SetFilePointer(hFile,GETFILESIZE(hFile,0)-SizeOf(FTagRecord)-SizeOf(FTagRielli), NIL, FILE_BEGIN);
        IF writefile(hFile, FTagRielli,SizeOf(FTagRecord)+SizeOf(FTagRielli),dwread, nil)=FALSE THEN
        SHOWMESSAGE(FLOATTOSTR(GetLastError));
No funciona bien con "TFileStream" y "AssignFile".
Ahora me encuentro con el problema de que bajo Windows XP funciona perfecto, pero en Windows Vista y seven, no graba el archivo. Lo ejecute como administrador y tampoco. Cambio algo con estas versiones de Win?

ebeltete 26-03-2014 22:00:24

He estado leyendo algo al respecto, y encuentro algo como esto: Createfile falla con Windows 7 no logro entender bien, pero puede ser que Win7 no deja sobreescribir el archivo?

ebeltete 16-06-2014 17:07:53

hola, vuelvo a consultar. Estoy Probando el codigo en Delphi xe6 y no funciona como Delphi 5, me parece que el problema esta en la codificacion de caracteres. Puede ser?


La franja horaria es GMT +2. Ahora son las 03:38:54.

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