PDA

Visualizza versione completa : [Visual Studio 2010 Express] Programmino per rinominare file


willy.z
16-07-2012, 12.33.02
Ciao a tutti, come da titolo sto cercando di creare un semplicissimo è programmino per rinominare alcuni file.

PERCHE'???
In ufficio devo archiviare le email in un determinato modo, ma non abbiamo trovato nessun programma di archiviazione che ci soddisfi.

In pratica esportando da Windows Live Mail mi trovo file in questo formato:
4C8D33AF-00000D55.eml

e voglio modificarlo ad esempio in:
2010-03-02 12.30.48 [Subj]verificare sezioni.eml

quindi anno, mese, giorno, ora e oggetto

Il problema è che dopo aver rinominato un tot di file si ferma sempre su un file specifico dicendomi che "Impossibile completare l'operazione. Nel percorso 'XXXXXX' è già presente un file."

Il file però non è presente (almeno non con quel nome); ho inserito anche un controllino nelle ultime righe ma non funziona.

help me! :wall::wall::wall::wall:

willy.z
16-07-2012, 12.33.58
Questo è il tabulato che ho tirato giù:


Module Module1

Sub Main()
Dim file
Dim NuovoNome

'Loop through each file in the folder
For Each file In My.Computer.FileSystem.GetFiles("C:\Users\zilli\Desktop\POSTA\", FileIO.SearchOption.SearchAllSubDirectories)
If file.contains(".eml") = False Then
My.Computer.FileSystem.DeleteFile(file)
ElseIf file.Contains("[Subj]") Then
Else
'leggi righe da file
Dim sr As IO.StreamReader = IO.File.OpenText(file)
Dim testlinea As String
Dim Data As String = 0
Dim Oratrim As String = 0
Dim Datatrim(0 To 2) As String
Dim Soggetto As String = 0

Do
testlinea = sr.ReadLine()
If testlinea.Contains("Subject: ") Then
Soggetto = testlinea
ElseIf testlinea.Contains("Date: ") Then
Data = testlinea
End If
Loop Until Data <> "0" And Soggetto <> "0"

'eliminare caratteri non consentiti e modificare il SOGGETTO
Soggetto = Replace(Soggetto, "Subject: ", "[Subj]")
Soggetto = Replace(Soggetto, ":", "_")
Soggetto = Replace(Soggetto, "\", "_")
Soggetto = Replace(Soggetto, "/", "_")
Soggetto = Replace(Soggetto, ">", "_")
Soggetto = Replace(Soggetto, "<", "_")
Soggetto = Replace(Soggetto, "?", "_")
Soggetto = Replace(Soggetto, "*", "_")
Soggetto = Replace(Soggetto, "|", "_")
Soggetto = Replace(Soggetto, "*** SPAM ***", "SPAM")
Soggetto = Replace(Soggetto, vbTab, " ")
Soggetto = Replace(Soggetto, Chr(34), "''")

'eliminare caratteri non consentiti e modificare la DATA
Data = Right(Data, 26)
Data = Left(Data, 20)
Data = Replace(Data, ":", ".")
Data = Replace(Data, " Jan ", "-01-")
Data = Replace(Data, " Feb ", "-02-")
Data = Replace(Data, " Mar ", "-03-")
Data = Replace(Data, " Apr ", "-04-")
Data = Replace(Data, " May ", "-05-")
Data = Replace(Data, " Jun ", "-06-")
Data = Replace(Data, " Jul ", "-07-")
Data = Replace(Data, " Aug ", "-08-")
Data = Replace(Data, " Sep ", "-09-")
Data = Replace(Data, " Oct ", "-10-")
Data = Replace(Data, " Nov ", "-11-")
Data = Replace(Data, " Dec ", "-12-")
If Left(Data, 1) = " " Then
Data = LTrim(Data)
Data = "0" & Data
End If

Oratrim = Right(Data, 8)

'Data in formato internazionale
Datatrim(0) = Left(Data, 2)
Datatrim(1) = Left(Data, 5)
Datatrim(1) = Right(Datatrim(1), 2)
Datatrim(2) = Left(Data, 10)
Datatrim(2) = Right(Datatrim(2), 4)
Data = Datatrim(2) & "-" & Datatrim(1) & "-" & Datatrim(0)

NuovoNome = Data & " " & Oratrim & " " & Soggetto & ".eml"

'Chiude lettura del file
sr.Close()

'Rinominare file
If My.Computer.FileSystem.FileExists(NuovoNome) = False Then
My.Computer.FileSystem.RenameFile(file, NuovoNome)
Else
Resume Next
End If
End If
Next

End Sub

End Module

retalv
16-07-2012, 13.57.05
Il file però non è presente (almeno non con quel nome); ho inserito anche un controllino nelle ultime righe ma non funziona
Potrebbe essere la presenza di un carattere non stampabile o che relamente il file esiste già, anche se non ti sembra.

Aggiungi alla routine una stampa a video prima di tentare il rename e controlla la corrispondenza (magari con una ricerca del nome file che dovrai creare) con i files gia presenti: se tutto quadra ma continua a dare l'errore, invece di rimpiazzare i singoli caratteri metti il rimpiazzo...

Se più basso del primo stampabile > rimpiazza con...
Se più alto dell'ultimo stampabile > rimpiazza con...

Dove per stampabile consideri il puro alfabeto inglese ABC...XYZ, in modo da eliminare tutte le spurie.

willy.z
16-07-2012, 15.32.44
In realtà mi sembrava che già le ultime 5 righe:

If My.Computer.FileSystem.FileExists(NuovoNome) = False Then
My.Computer.FileSystem.RenameFile(file, NuovoNome)
Else
Resume Next
End If

bastassero per evitare il problema, al più pensavo non mi rinominasse il file così potevo vedere quali oggetti davano problemi...invece mi si pianta sempre sullo stesso.

Ora provo la sostituzione caratteri come dici tu e vediamo (perchè in effetti all'inizio mi ero dimenticato le tabulazioni e ho impiegato un'ora a capire cosa non gli andasse a genio!!!)

Intanto ti ringrazio.

willy.z
16-07-2012, 17.31.00
Eccomi di nuovo...
ho fatto come mi hai detto e effettivamente risolvo la maggior parte dei problemi (in pratica sostituisco qualsiasi carattere che non sia lettera, numero o parentesi quadra con un underscore).

Mi rimane però l'errore di prima.

Ragionandoci questa secondo me è la motivazione:
facendo girare il programma mi rinomina tutti i files, poi facendolo rigirare sempre sulla stessa dir (ma con i file già rinominati) lui non riesce a rinominare il file perchè a questo punto nuovo e vecchio nome coincidono...dovrei inserire un controllo sui nomi ma non riesco a farlo funzionare.

willy.z
16-07-2012, 18.03.00
EUREKA!

Il problema era il seguente: tra le email c'erano non so per quale motivo due duplicati, quindi email con stesso oggetto data e ora; finchè WLM le esportava venivano dati due nomi differenti ma poi quando le rinominavo chiaramente il nome era lo stesso (per come ho impostato io il programma).

Ho inserito il seguente controllo:

If file.contains(NuovoNome) = True Then
'Passa oltre
Else
'Chiude lettura del file
sr.Close()
'Rinominare file
Try
My.Computer.FileSystem.RenameFile(file, NuovoNome)
Catch ex As Exception
My.Computer.FileSystem.DeleteFile(file)
End Try
End If

in modo che se non riesce a rinominare il file vuol dire che necessariamente ce n'è già uno identico, per cui lo cancella.

retalv
19-07-2012, 12.39.00
EUREKA!

Il problema era il seguente: tra le email c'erano non so per quale motivo due duplicati, quindi email con stesso oggetto data e ora
c.v.d. ;)