Pessoal, estou com um problema em que dois "usuários" ou "programas" geram informações para um mesmo arquivo. Se o enter for colocado no mesmo instante a linha fica sobreposta com os dois registros. Criamos dois programas para simular o erro, quando executados juntos um registro se sobrepoe ao outro. Programa1: DEF VAR x as char format "9999999". DEF VAR Y AS CHAR FORMAT "X(10)" INITIAL "bbbbbbbbbb". DEF VAR K AS CHAR FORMAT "X(15)" INITIAL "CCCCCCCCCCCCCCC". DEF VAR L AS CHAR FORMAT "x(10)" INITIAL "DDDDDDDDDD". DEF STREAM xx. OUTPUT STREAM xx TO ttt.txt APPEND. REPEAT: m = m + 1. x = STRING(m, "9999999") PUT STREAM xx x ";" y ";" k ";" l ";" "ffffffffffffffffffff". pause 1 no message. end. output stream xx close. PROGRAMA 2 DEF VAR x as char format "9999999". DEF VAR Y AS CHAR FORMAT "X(10)" INITIAL "bbbbbbbbbb". DEF VAR K AS CHAR FORMAT "X(15)" INITIAL "CCCCCCCCCCCCCCC". DEF VAR L AS CHAR FORMAT "x(10)" INITIAL "DDDDDDDDDD". DEF STREAM xx. OUTPUT STREAM xx TO ttt.txt APPEND. REPEAT: m = m + 1. x = STRING(m, "9999999") PUT STREAM xx x ";" y ";" k ";" l ";" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee". pause 2 no message. end. output stream xx close. Alguém sabe como resolver ? Agradeço Marly
Marly, Pelo que sei, só tem 2 jeitos: 01) Gravar em diretórios diferentes 02) Gravar o arquivo com nomes diferentes, por exemplo ttt-<nome usuario>.txt
Olá Eduardo, muito obrigada pela sua sempre bem vinda e brilhante ajuda. O problema é que se trata de um arquivo com dados de Clientes. Cada alteração que os usuários de várias áreas fazem durante o dia geram um arquivo que à noite sobe para o arquivo geral de clientes do banco na alta plataforma. O problema é como utilizar o arquivo txt gerado com "exclusive-lock". A não ser que geramos os arquivos com o nome dos usuários durante o dia e a noite antes de enviar para a outra plataforma juntar os dados dos arquivos e enviar... Vou conversar com o pessoal para saber se isto é viável... Vai dar mais trabalho, mas se é o único jeito... Fazer o quê ? Vamos para frente .... rsrsrsrs... Obrigada. Marly
Marly, Andei pesquisando na internet e consegui montar um código que você poderá adaptar a sua necessidade, o básico dele é o seguinte: 01) Se o arquivo não existir irá criar um novo arquivo sem registros; 02) Verifica se o arquivo está bloqueado: a) Está bloqueado, mostra mensagem informando para aguardar pois o arquivo está bloqueado para escrita; b) Não está bloqueado, abre o arquivo para a escrita e bloqueia ele; 03) Terminou a escrita do arquivo libera ele e os outros usuários que estavam aguardando passam a escrever um de cada vez. Veja o código abaixo, execute-o em duas sessões distintas e você verá um exemplo do citado acima: Código: &global-define GENERIC_WRITE 1073741824 /* &H40000000 */ &global-define OPEN_EXISTING 3 &global-define FILE_SHARE_READ 1 /* = &H1 */ &global-define FILE_ATTRIBUTE_NORMAL 128 /* = &H80 */ procedure CreateFileA external "kernel32": def input param lpfilename as character. def input param dwdesiredaccess as long. def input param dwsharemode as long. def input param lpsecurityattributes as long. def input param dwcreationdisposition as long. def input param dwflagsandattributes as long. def input param htemplatefile as long. def return param returnvalue as long. end procedure. procedure CloseHandle external "kernel32": def input param hobject as long. def return param returnvalue as long. end procedure. def var lpsecurityatt as int no-undo. def var hobject as int no-undo. def var nreturn as int no-undo. def var c-arquivo as char no-undo. def var iContador as int no-undo. assign c-arquivo = "c:/temp/arquivo.txt". file-info:file-name = c-arquivo. if file-info:full-pathname = ? then do: output to value(c-arquivo). output close. file-info:file-name = c-arquivo. end. /* Coloca o arquivo no modo de bloqueio */ run CreateFileA (input c-arquivo, input {&GENERIC_WRITE}, {&FILE_SHARE_READ}, lpSecurityAtt, {&OPEN_EXISTING}, {&FILE_ATTRIBUTE_NORMAL}, 0, output hObject) no-error. repeat while hobject = -1: disp skip(2) " Aguarde... Arquivo está sendo usado por outro usuário! " skip(2) with with frame x view-as dialog-box. pause 1. if hobject = -1 then /* Desbloqueia o arquivo */ run closehandle (input hobject, output nreturn) no-error. /* Coloca o arquivo no modo de bloqueio */ run CreateFileA (input c-arquivo, input {&GENERIC_WRITE}, {&FILE_SHARE_READ}, lpSecurityAtt, {&OPEN_EXISTING}, {&FILE_ATTRIBUTE_NORMAL}, 0, output hObject) no-error. end. hide frame x. /* Desbloqueia o arquivo */ run closehandle (input hobject, output nreturn) no-error. output to value(c-arquivo) append. /* Coloca o arquivo no modo de bloqueio */ run CreateFileA (input c-arquivo, input {&GENERIC_WRITE}, {&FILE_SHARE_READ}, lpSecurityAtt, {&OPEN_EXISTING}, {&FILE_ATTRIBUTE_NORMAL}, 0, output hObject) no-error. put "Iniciando Arquivo - Programa 01" skip. do iContador = 1 to 15: put iContador format "999" " " today format "99/99/9999" " " string(time,"hh:mm:ss") " " "Escrevendo no Arquivo Handle " hobject skip. pause 1. end. output close. /* Desbloqueia o arquivo */ run closehandle (input hobject, output nreturn) no-error. message "Arquivo Liberado" view-as alert-box.
Olá Marley Só uma pergunta, você quer controlar o que foi alterado por cada área é isso ? Diego.Simao.