Visual Basic Scrittura su file con righe numerate

1

Questo è più un tipo di domanda di design / esperienza utente, quindi se appartiene a qualcun altro per favore fammelo sapere.

Ho un programma con più PictureBox:

PictureBox1
PictureBox2
.
.
PictureBox60

Il campo PictureBox di Tag viene compilato con un valore String. Quando l'utente fa clic su una casella immagine, la proprietà Tag viene inserita in ListBox e io li ordino manualmente:

1. ListBox item 1
2. ListBox item 2
3. ListBox item 3
etc

Ogni riga viene anche scritta in un file di testo, sempre con il numero di riga precedente all'elemento.

Condizione 1: se ci sono già elementi nel file, rileva quante linee sono attualmente nel file e continua la numerazione, quindi il file inizia con 1. Esempio:

File1.txt contiene già

1. Bob
2. Sally
3. Joe

e ListBox è vuoto. Se viene fatto clic su PictureBox con Tag "Charles", la ListBox ora contiene:

1. Charles

e File1.txt ora contiene

1. Bob
2. Sally
3. Joe
4. Charles

Condizione 2: il file non esiste ancora, e quindi quando gli elementi vengono aggiunti a ListBox e scritti nel file, il file viene creato e sono elencati nel file lo stesso come sopra. Gli elementi del file sono numerati a partire da 1.

Condizione 3: il file esiste, ma è vuoto. Voglio, indipendentemente dall'esistenza del file, la numerazione in detto file per iniziare con 1 e continuare la numerazione.

Ecco il codice che devo gestire queste tre condizioni. Mi sembra così disordinato e poco professionale, ma forse ho solo bisogno dell'approvazione degli altri per farlo sentire meno.

Private Sub saveToFile(boss As String, item As String)

    ' lineCount used so we know where to append in the file i.e. if there were already 5 lines we know to append at the 6th line
    ' + 1 to use 1 indexing
    Dim lineCount As Integer
    Dim fileExists As Boolean = False
    ' vars to retrieve item from ItemDropListBox and extract only the item name
    Dim lastItem As String = ItemDropListBox.Items.Item(ItemDropListBox.Items.Count - 1)
    Dim periodIndex As Integer = lastItem.IndexOf(".") + 2
    Dim itemStringLength As Integer = lastItem.Length - periodIndex
    Dim trimmedItem As String = lastItem.Substring(periodIndex, itemStringLength)

    Dim sw As IO.StreamWriter

    ' TODO just me being nitpicky
    '   [x] - If file doesn't exist, create it and being first item at 1
    '   [x] - If file does exist AND there is already items in it, write to it with correct order
    '   [x] - If file does exist and there is NOT items in it, write to it with correct order

    ' If the file exists, want to
    If My.Computer.FileSystem.FileExists(My.Application.Info.DirectoryPath & "/logs/" & boss & ".txt") Then
        lineCount = IO.File.ReadAllLines(My.Application.Info.DirectoryPath & "/logs/" & boss & ".txt").Count
        fileExists = True
    Else
        lineCount = 1
        fileExists = False
    End If

    ' True indicates append to file instead of overwrite
    sw = New IO.StreamWriter(My.Application.Info.DirectoryPath & "/logs/" & boss & ".txt", True)

    If fileExists = True Then
        ' Write the new item to the file
        sw.WriteLine((lineCount + 1) & ". " & trimmedItem)
    Else
        sw.WriteLine(lineCount & ". " & trimmedItem)
    End If


    ' Close file
    sw.Close()
End Sub

Domanda: Sto cercando troppo difficile di risolvere un problema che non accadrà mai? I file non saranno mai creati dall'utente 99,9% delle volte, solo dal codice, quindi la possibilità che abbiano anche un file esiste senza nulla all'interno è già molto sottile. Potrei avere un codice molto più elegante se non mi preoccupassi di gestire questa piccola possibilità.

Ho anche pensato di passare a C #. L'idea originale era di crearla in VB e quindi ricrearla in C #, ma penso che sarebbe una perdita di tempo e ho abbastanza esperienza che penso che C # andrebbe benissimo. Inoltre, da quello che posso dire, avrei molto più controllo sulle cose che voglio cambiare.

Modifica: sposta tutto il codice su C # - non c'è molto e mi sento troppo limitato con VB (nemmeno riguardo a questa domanda)

    
posta kf. 12.08.2016 - 03:49
fonte

2 risposte

3

La chiave è suddividere il problema in compiti più piccoli:

  • separa input , elaborazione e output in tre funzioni

  • la funzione di input dovrebbe leggere il file e restituire un elenco di stringhe. Se il file non esiste, dovrebbe restituire una lista vuota di stringhe (e non di più!). Nota non è necessario ricordare le informazioni se il file esiste in primo luogo per l'ulteriore elaborazione. Non vi è inoltre alcun motivo per distinguere i casi di un file vuoto o di un file non esistente.

  • la funzione di elaborazione dovrebbe ottenere un elenco di stringhe come input, la stringa da aggiungere e dovrebbe restituire il nuovo elenco di stringhe. Nota che trattare con la lista vuota come input non dovrebbe essere molto diverso dal trattare con liste non vuote

  • la funzione di output dovrebbe prendere l'elenco di stringhe e scriverlo di nuovo nel file. Nota che non devi dire esplicitamente a StringWriter che dovrebbe creare un nuovo file se non esiste, lo farà automaticamente per te se lo usi in modalità "sovrascrivi" anziché in modalità accodamento (quindi nel tuo codice , dovrebbe essere istanziato come New IO.StreamWriter(filename, False) .

Come vedi, trattare con file vuoti o file esistenti o non esistenti è solo un problema minore qui, quindi rendere il tuo programma abbastanza robusto per gestire questi casi non è niente che dovrebbe causarti un mal di testa.

Un'ultima nota per il porting del codice VB su C #: forse conosci C # meglio di VB (come me), ma VB.NET e C # hanno quasi le stesse funzionalità. Per imparare come suddividere un problema più grande in compiti più piccoli, è irrilevante quale delle due lingue utilizzi.

    
risposta data 12.08.2016 - 08:16
fonte
0

Hai considerato se hai bisogno di numeri affatto ?

Condition 1: If there are already items in the file, it detects how many lines are currently in the file and continues the numbering

Quindi, se ci sono tre righe nel file e ne aggiungi (aggiungi) un'altra, nel file ci saranno quattro righe:

Before   After 
-------  -------
Bob      Bob
Sally    Sally
Joe      Joe
         Charles

Condition 2: The file does not yet exist ... The file items are numbered beginning with 1.

Before   After 
-------  -------
         Bob

Condition 3: The file exists, but is empty. ... the numbering in said file to begin with 1 and continue the numbering.

Before   After 
-------  -------
         Bob

Come puoi vedere, la numerazione manuale è ridondante, perché la posizione fisica di ogni riga entro il file definisce la sequenza di ogni elemento. Se necessario, questi numeri di sequenza possono essere facilmente ricavati dal momento che il file viene letto nel programma, riga per riga.

I have also already considered moving to C#.

Anche se è vero che nei giorni precedenti di .Net, l'ambiente C # "ha acquisito" nuove funzionalità [almeno] una versione precedente alla controparte di Visual Basic , questo non è più il caso. In effetti, c'è ben poco beneficio da una lingua all'altra, salva la tua esperienza personale / conforto / competenza con quella che preferisci.

Entrambe le lingue hanno tutte le stesse Classi Framework a loro disposizione; c'è praticamente niente che puoi fare in uno che non puoi fare nell'altro.

    
risposta data 12.08.2016 - 13:51
fonte

Leggi altre domande sui tag