Pfad des StreamWriters ändern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von masterm.

    Pfad des StreamWriters ändern

    Hallöchen Leute, es ist mal wieder so weit, dass ich 'ne Frage habe, die mir weder die MSDN, noch Google nach längerem Durchsuchen beantworten können.
    Ich wollte wissen, ob es möglich ist, den Dateipfad abzuändern.

    Mein erster Ansatz war, dass es vielleicht eine Property gibt. Der hat aber nur eine und die lautet AutoFlush.
    Meine zweite Idee war, hinter den Streamwriter ein Gleichheitszeichen und den Dateipfad zu schreiben, also LogStreamWriter = "C:\log.txt". Mir war schon im Voraus klar, dass das eigentlich nicht funktionieren dürfte, aber ich habe es trotzdem mal probiert; natürlich mit dem zum erwartenden Fehler als Ergebnis.

    Der StreamWriter wird in mehreren Subs verwendet, die zum Teil sehr oft aufgerufen werden und ich kann aus Performance-Gründen nicht jedes mal ihn neu deklarieren. Der Pfad wird erst durch eine Benutzereingabe festgelegt.

    Weiß einer von euch vielleicht weiter?

    Danke schon mal im Voraus!
    Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

    43232069737420636f6f6c21
    Jou.

    masterm schrieb:

    den Dateipfad abzuändern.
    Warum?
    2 Dateien, 2 Instanzen.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Thunderbolt schrieb:

    was spricht dagegen, das Objekt mit dem neuen Pfad neu zu instanziieren?

    Ich müsste ihn dann also in jeder Sub mit Dim deklarieren?

    RodFromGermany schrieb:

    2 Dateien, 2 Instanzen.
    Feddich.

    Es sind aber keine zwei Dateien. Am Anfang des Programms wird ein Ordner ausgewählt, in dem der Log (die Datei) gespeichert werden soll und dann wird durch eine andere Sub der Log beschrieben. Verkürzter Programmcode (ein Paar für hier unnötige Subs entfernt):
    Code

    VB.NET-Quellcode

    1. Module Main
    2. Property Directory As String
    3. Property CreateLog As Boolean
    4. Dim fileDictionary As New Dictionary(Of String, String)
    5. Dim hashDictionary As New Dictionary(Of String, List(Of String))
    6. Dim logFileName As String = ""
    7. Dim logWriter As New System.IO.StreamWriter("")
    8. Sub Main()
    9. Console.Title = "DoubleDataFinder"
    10. Log("DoubleDataFinder (c) 2015 Mario Wagenknecht")
    11. Log("-------------------------------------------")
    12. Log("")
    13. AskDirektory()
    14. While System.IO.Directory.Exists(Directory) = False
    15. Log("Directory does not exist!")
    16. Log("")
    17. AskDirektory()
    18. End While
    19. Log("")
    20. AskLog()
    21. Clear()
    22. GenerateFileHashes()
    23. Pause()
    24. End Sub
    25. Sub AskDirektory()
    26. Log("Please enter the directory path:")
    27. Directory = Console.ReadLine()
    28. End Sub 'Asks the directory to check
    29. Sub AskLog()
    30. Log("Should a log file be created? (recommended) y / n")
    31. While True
    32. Dim key As New ConsoleKeyInfo
    33. key = Console.ReadKey(True)
    34. If key.Key = ConsoleKey.Y Then
    35. Log("Generating log file . . .")
    36. logFileName = System.IO.Path.Combine(Directory, "DoubleDataFinderLog_" & New Date().ToLocalTime().ToString("yyyy-MM-dd_HH-mm") & ".txt") 'Generates file name
    37. logWriter.AutoFlush = True
    38. Try
    39. 'Irgendwie dem Streamwriter einen neuen Ordner anweisen (nämlich Directory) und ein paar Zeilen schreiben.
    40. Log("Done")
    41. Catch ex As Exception
    42. Console.WriteLine("WARNING: Can not write log file! Log file is disabled now.")
    43. CreateLog = False
    44. End Try
    45. CreateLog = True
    46. Exit While
    47. ElseIf key.Key = ConsoleKey.N Then
    48. CreateLog = False
    49. Exit While
    50. End If
    51. End While
    52. End Sub 'Asks if a log file should be created
    53. Sub GenerateFileHashes()
    54. Log("Generating file hashes list . . .")
    55. For Each file In System.IO.Directory.GetFiles(Directory)
    56. If Not file = logFileName Then 'Ignores actualt log file
    57. fileDictionary.Add(file, hashFile(file))
    58. Log(file)
    59. End If
    60. Next
    61. Log("Done!")
    62. Log("")
    63. End Sub 'Generate the sha512-hashes of all files in the directory and add them to fileDictionary
    64. Sub Pause()
    65. Console.WriteLine("")
    66. Console.WriteLine("Please press any key . . .")
    67. Console.ReadKey()
    68. End Sub
    69. Sub Log(ByVal value As String)
    70. Console.WriteLine(value)
    71. If CreateLog = True Then
    72. Try
    73. logFileName(message)
    74. Catch ex As Exception
    75. Console.WriteLine("WARNING: Can not write log file! Log file is disabled now.")
    76. CreateLog = False
    77. End Try
    78. End If
    79. End Sub
    80. End Module
    Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

    43232069737420636f6f6c21
    Nö, eine globale Variable, auf die dann alle Methoden zugreifen:

    VB.NET-Quellcode

    1. Dim globalVar As String
    2. Sub a()
    3. Console.WriteLine(globalVar)
    4. End Sub
    5. Sub b()
    6. Console.WriteLine(globalVar)
    7. End Sub
    Mit freundlichen Grüßen,
    Thunderbolt

    masterm schrieb:

    VB.NET-Quellcode

    1. AskDirektory()
    Das schreit doch nach einer WinForms-Anwendung, nutze einfach den FolderBrowserDialog.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Thunderbolt schrieb:

    Kommandozeilentool
    OK.
    Das kennt aber IO.DirectoryInfo.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht darum, ob man den Dateipfad eines StreamWriters nachträglich ändern kann und wenn ja, wie, ohne ihn immer neu deklarieren zu müssen.

    Und kleine Nebenfrage: Was hat das ganze Thema mit IO.DirectoryInfo zu tun? Eigentlich doch gar nichts, oder?

    Gruß
    Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

    43232069737420636f6f6c21

    masterm schrieb:

    VB.NET-Quellcode

    1. Sub AskDirektory()
    2. Log("Please enter the directory path:")
    3. Directory = Console.ReadLine()
    4. End Sub 'Asks the directory to check

    masterm schrieb:

    Eigentlich doch gar nichts
    Oder doch?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe jetzt gar nichts mehr! Bitte erklär mir, was du meinst.
    Wenn du meinst, dass ich anstatt eines Strings eine DirectoryInfo nehmen soll, dann ist das doch eigentlich für diese Frage egal, nicht?
    Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

    43232069737420636f6f6c21

    masterm schrieb:

    anstatt eines Strings eine DirectoryInfo nehmen
    NoGo: Möglicherweise endlose Eingabe, bis das richtige Verzeichnis eingetippt wurde.
    Lerne, was eine DirectoryInfo ist und was man mit ihr machen kann:

    VB.NET-Quellcode

    1. Dim di() = New IO.DirectoryInfo("c:\Temp").GetDirectories()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!