Newsgroup: it.comp.lang.javascript
Titolo: Oggetto ActiveX per salvataggio e modifica di files di testo

Frequentando il vostro solido gruppo di discussione ho avuto modo di
imparare parecchie cosette davvero interessanti.
Mi sono messo in disparte, ho ascoltato (letto) ed assorbito il vostro
sapere in maniera mediata e discreta.
Ma adesso sono costretto ad interrogarvi direttamente.
Dovendo costruire un sistema di archiviazione di cartelle mediche, con un
corrispondente archivio di referti medici ed un motore di ricerca, ho
inizialmente pensato di poter risolvere il problema col JavaScript.
Dopo aver raggranellato informazioni e brani di codice sufficienti per il
tutto, mi sono accorto con orrore di non poter salvare le pagine prodotte su
disco fisso (N.B. si lavora off-line).
Ho provato inizialmente a lavorare con i cookies, solo che, dopo aver
completato il codice necessario, un uccellino mi ha detto che sono
sottoposti a pesanti limiti quantitativi e che possono essere
arbitrariamente cancellati dal browser.
Dopo disperate ricerche ho trovato alcune soluzioni ellittiche che
coinvolgevano, oltre la semplificazione del flusso di dati da salvare,
leggere o modificare in un solo file di testo, anche il VBscripting (di cui
non so nulla). Manco a dirlo non riesco a farli funzionare correttamente e
nessuno sa dirmi perchè (io lo so e l'ho scritto nella parentesi
precedente).
Adesso sono a questo punto:
    Vi mando qualche linea di codice che dovrebbe (e sottolineo "dovrebbe"!)
fare al caso mio.
    Utilizza un oggetto ActiveX chiamato Scripting.FileSystemObject che
gestisce proprio questo genere di operazioni (creazione, lettura e
aggiornamento di dati, in particolare in formato TXT).
    La documentazione (scarna) la si trova sul sito della Microsoft; solo
che... è SBAGLIATA!
    Secondo il mio IE5.0 "non è definita" la costante ForAppending (che
serve per indicare che potrei anche avere l'intenzione di modificare il
file; l'unica altra alternativa è mettere ForReading, con la comparsa del
solito errore, o non mettere niente, ma il default e di sola lettura).
    Se non metto niente la routine di scrittura gira, mentre quelle di
lettura ed aggiornamento mi rilevano un errore sul metodo WriteLine (anche
quando la condizione che dovrebbe farlo eseguire non è verificata) ed
inoltre non leggono un beneamato sottinteso dato che il corrispettivo metodo
ReadLine me lo sono inventato (dalla Microsoft vanno proprio al risparmio in
quanto ad informazioni).
    Ammetto di essere un neofita. Ma che devo fare, tiro il grilletto?
------- Inizio codice -------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Scrittura, lettura e aggiornamento tramite oggetti ActiveX</TITLE>
</HEAD>
<BODY BGCOLOR="#ffffff" TEXT="#0000a0>
<SCRIPT LANGUAGE="JavaScript1.2">
<!-- ;
var fs= new ActiveXObject("Scripting.FileSystemObject");
function CreaTesto() {
 var a = fs.CreateTextFile("c:\\testoProva.txt", true);
 a.WriteLine("Questo è un testo di prova.");
 a.Close();
}
function LeggiTesto(x) {
 var b = fs.OpenTextFile("c:\\testoProva.txt", ForAppending, false);
 if (x != "") {
  b.WriteLine(x);
 }
 c = b.ReadLine;
//  Ah, se trovassi il Metodo giusto per leggere una linea di testo o per
sapere quante linee ci sono nel file
 document.write(c);
 b.Close();
}
// end hide -->
</SCRIPT>
<DIV ID="testo1" onclick= "CreaTesto()">crea<DIV><BR>
<DIV ID="testo2" onclick= "LeggiTesto('- Nuova Linea -')">aggiorna<DIV><BR>
<DIV ID="testo3" onclick= "LeggiTesto()">leggi<DIV><BR>
</BODY>
</HTML>
------- Fine codice -------

Ho trovato la documentazione che cercavo (su MSN) in riferimento al
TextStream object.
Tra quella specifica per le sue proprietà ho visto che bisogna prima
definire un
var ForAppending = 1
prima di poterlo utilizzare.
In quanto al ReadLine, avevo indovinato il nome, ma mancavano le due
parentesi (tonde e) vuote subito dopo
Se funziona, stappo una bottiglia. :-p

Se a qualcuno interessa ecco il codice funzionante (su IE5.0):
<HTML>
<HEAD>
<TITLE>Scrittura, lettura e aggiornamento tramite oggetti ActiveX</TITLE>
</HEAD>
<BODY BACKGROUND="" BGCOLOR="#ffffff" TEXT="#0000a0" LINK="#ff8040"
VLINK="#8000ff" ALINK="#00ff00">
<SCRIPT LANGUAGE="JavaScript1.2">
<!-- ;
var fs= new ActiveXObject("Scripting.FileSystemObject");
function CreaTesto(x) {
 var str = new String (x);
 var a = fs.CreateTextFile("c:\\testoProva.txt", true);
 var str1= str.substring(0,1);
 if  (str1 != "|")  x = "|" + x ;
 x += "<BR>";
 a.WriteLine(x);
 a.Close();
}
function LeggiTesto(x) {
 var s ="";
 var ForAppending = 1;
 var b = fs.OpenTextFile("c:\\testoProva.txt", ForAppending, false);
 if (x != "") {
  while( ! b.AtEndOfStream) s += b.ReadLine();
  s += "|" + x;
  CreaTesto(s);
 }
 var b = fs.OpenTextFile("c:\\testoProva.txt", ForAppending, false);
 c = b.ReadAll();
 document.write(c);
 b.Close();
}
// end hide -->
</SCRIPT>
<DIV ID="testo1" onclick= "CreaTesto('Questo è un testo di
prova')">crea<DIV><BR>
<DIV ID="testo2" onclick= "LeggiTesto('- Nuova Linea -')">aggiorna<DIV><BR>
<DIV ID="testo3" onclick= "LeggiTesto('')">leggi<DIV><BR>
</BODY>
</HTML>
E' vero, necessita di ottimizzazione. Ma non sono granché capace.
Alcune operazioni "barocche" le ho inserite per evitare indefinibili (no,
anzi, "bastardi") messaggi d'errore.
Ciao
    Luca