2017-01-10 5 views
0

私は内部にデータを含む.xmlファイルを作成する機能を持っています。まず、古いファイルを削除します。それは時々凍結され、ファイル自体がロックされる以外はすべて正常に動作します。サイズは0 kbで、プログラムでもそれを削除することはできません。そして、私はプロセスを終了し、自分でファイルを削除してから、プログラムを再実行する必要があります。新しいプログラムの開始前に同じプログラムのすべてのプロセスを終了することは可能ですか?または少なくともいくつかの時間が経過した後自動的にオフになることを確認するために、いくつかのタイマーを置く?Visual Fox Proファイルへのアクセス

ありがとうございました。

fHandle = f_cFile("D:\Data\new_eur\Saskaitos.xml") 
if fHandle < 0 
**=messagebox("Can't create file!",16,"!!!") 
=STRTOFILE("Can't create XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
quit 
ENDIF 

** Header 
if fputs(fHandle, '<?xml version="1.0" encoding="windows-1257"?>') < 0 
=fclose(fHandle) 
=STRTOFILE("Can't write to XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
quit 
endif 

=STRTOFILE(TTOC(dateTIME()) + ": " + "XML ok"+CHR(13)+CHR(10), "d:\LogData.txt", 1) 
=fputs(fHandle, "<Accounts>") 

enteris = CHR(13) 
DO WHILE NOT EOF() 
=fputs(fHandle, "<Detali>") 
=fputs(fHandle, "<Snr><![CDATA[" + ALLTRIM(Data.dok_nr) + "]]></Snr>" + enteris) 
=fputs(fHandle, "<Code_ks><![CDATA[" + ALLTRIM(Data.Code_ks) + "]]></Code_ks>" + enteris) 
=fputs(fHandle, "<Sdata>" + ALLTRIM(Data.dok_data) + "</Sdata>" + enteris) 
=fputs(fHandle, "<Term>" + ALLTRIM(Duomenys.Terminas) + "</Term>" + enteris) 
=fputs(fHandle, "<Manager><![CDATA[" + ALLTRIM(Data.Code_ms) + "]]></Manager>" + enteris) 
IF Data.val_poz = 0 
    =fputs(fHandle, "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaMok, 12, 2)) + "</MokSuma>" + enteris) 
    =fputs(fHandle, "<ApSuma>" + ALLTRIM(STR(Duomenys.ApSuma, 12, 2)) + "</ApSuma>" + enteris) 
ELSE 
    =fputs(fHandle, "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaVal, 12, 2)) + "</MokSuma>" + enteris) 
    =fputs(fHandle, "<ApSuma>" + ALLTRIM(STR(Duomenys.ApVal, 12, 2)) + "</ApSuma>" + enteris) 
ENDIF 
=fputs(fHandle, "</Detali>")  
skip 
ENDDO 
fputs(fHandle, "</Accounts>") 
=fclose(fHandle) 

これはxmlデータをファイルに挿入するコードです。ある時点でそれはフリーズし、次回のプログラム開始時には同じファイルを使用しています。

機能f_cFile:

FUNCTION f_cFile 
PARAMETERS fName 
fHandle = fcreate(fName) 
IF fHandle < 0 
    IF FILE(fName,1) 
     DELETE FILE fName 
     IF FILE(fName,1) 
      =STRTOFILE("Can't delete old file: " + fName + CHR(13) + CHR(10), " d:\Log.txt", 1) 
     ELSE  
      fHandle = fcreate(fName)   
     ENDIF 
    ENDIF 
ENDIF 
RETURN fHandle 
ENDFUNC 
+0

XMLファイルを作成して削除しようとしているコードを貼り付けることはできますか?それはCursorToXML()またはXMLAdapterクラスを使用して低レベルまたは単純ですか? – DRapp

+0

私は最初の投稿を編集し、いくつかのコード部分を追加しました。おそらくもっと明らかになったかもしれません。 – The50

+0

あなたのコードは、VFPで可能な限り速く実行しているようです。私はあなたがファイルに関する情報とそれらがどのように関連しているかを伝えるべきだと思います。ただし、fHandleの代わりにm.fHandleを使用してください。 'enteris'変数は必要ありません.Fputs()は自動的にCR(chr(13))とLF(chr(10))を追加します。このコードがハングアップする(データがリモートマシン上にあり、ネットワークが非常に遅いことを思い出させる - 私はFile()を全く使わないと信じていない)。 –

答えて

1

うわー...あなたのロックの問題を単純化するために、他の多くのオプションがあります。まず、自分のものはあまり変えずに作業が終了するまで、そのような単一の書き込みコマンドでそれを書く...文字列を使用して構築する変数を作成し、それに追加するに保つことです。..完了

enteris = CHR(13) 
myXML = '<?xml version="1.0" encoding="windows-1257"?>' + enteris; 
     + "<Accounts>" 

SCAN 
    myXML = myXML + "<Detali>"; 
      + "<Snr><![CDATA[" + ALLTRIM(Data.dok_nr) + "]]></Snr>" + enteris; 
      + "<Code_ks><![CDATA[" + ALLTRIM(Data.Code_ks) + "]]></Code_ks>" + enteris; 
      + "<Sdata>" + ALLTRIM(Data.dok_data) + "</Sdata>" + enteris; 
      + "<Term>" + ALLTRIM(Duomenys.Terminas) + "</Term>" + enteris; 
      + "<Manager><![CDATA[" + ALLTRIM(Data.Code_ms) + "]]></Manager>" + enteris 

    IF Data.val_poz = 0 
     myXML = myXML + "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaMok, 12, 2)) + "</MokSuma>" + enteris; 
       + "<ApSuma>" + ALLTRIM(STR(Duomenys.ApSuma, 12, 2)) + "</ApSuma>" + enteris 
    ELSE 
     myXML = myXML + "<MokSuma>" + ALLTRIM(STR(Duomenys.SumaVal, 12, 2)) + "</MokSuma>" + enteris; 
       + "<ApSuma>" + ALLTRIM(STR(Duomenys.ApVal, 12, 2)) + "</ApSuma>" + enteris 
    ENDIF 
    myXML = myXML + "</Detali>"; 
ENDSCAN 

myXML = myXML + "</Accounts>" 

if StrToFile(myXML, "D:\Data\new_eur\Saskaitos.xml") = 0 
    =STRTOFILE("Can't create XML file" + CHR(13) + CHR(10), "d:\Log.txt", 1) 
endif 

.. VFPが書き込みの低レベルの開閉を処理するようにします。

+0

私はこのようなやり方はまったく提案しません。 VFPでの文字列操作は遅く、文字列に何度も追加するとメモリを消費するのに役立ちます。このアプローチは、Fputs()アプローチよりもずっと前に失敗する可能性があります。 –

+0

それ以外のアイデアは? – The50

+0

@ The50、私はあなたの投稿の下にコメントを追加しました。あなたがしていることは、すでにそれを行う最速の方法だと思われます。別の方法でxmlを作成するには、XMLAdapterクラスを使用することができます(cursortoxmlはそのままでは役に立ちません)。ただし、FPuts()を使用してハングしている場合は、最初にハングする理由を理解する必要があります。 –

関連する問題