VB2012/10 Dateien/ordner aus Roaming-Ordner kopieren

Hi.

Ich (&meine Freunde) haben ein Problem.

Wir bauen grad an einer großen Minecraft-Map, an der jeder immer weiterbaut. Also zB 1. Spieler -> 2. Spieler usw.
Aber keiner unserer PCs ist gut genug für einen Server (bis auf meiner, aber ich bin kaum da, um einen Server zu hosten und kaufen ist nichts :D)

Und nun will ich ein Programm schreiben, dass es den save-Ordner von MC in den Öffentlichen Ordner (C:\Users\Public) kopiert, damit jeder von uns darauf zugreifen kann. (Wir sind via Hamachi verbunden).
Einer ist sozusagen der "Hoster" des Saves-Ordners.

Er arbeitet mit 2 PCs, also hab ich mir dann gedacht, warum 2 Programme zu schreiben, wenn ich mit einem Programm direkt in den Pfad von beiden Ordnern komme. (C:\Users\XXXXXXX\AppData\Roaming\.minecraft)

Aber ich weiß nicht wie seine Benutzernamen sind (von windows)
Also will ich, dass das Programm in das Benutzerverzeichnis geht, den saves-ordner nach (C:\Users\Puplic) kopiert.

Wie kann ich das am besten machen? ich habs mit shell schon versucht, aber da schmiert es am cd befehl ab ("") hab ich nach dem shell-befehl gemacht.

oder versuch über %appdata% reinzukommen schlug auch fehl. Kann mir da jemand helfen?

schonmal danke für eure Hilfe ;)
 
Zuletzt bearbeitet:
Code:
xcopy /EHKYI "%APPDATA%/.emacs.d" "d:/Temp/emacstemp"
kopiert bei mir in der CMD testweise alles aus
"X:\Users\CDW\AppData\Roaming/.emacs.d"
in den Tempordner.
Sollte auch mit Minecraft klappen. Gegebenfalls muss man noch die richtigen Flags nachschlagen (xcopy /? in der CMD).
 
Versteh ich nicht so ganz.

Hast doch oben geschrieben, dass du es als Shell/Batch Skript haben willst und jetzt aufeinmal doch ohne?
 


Danke!

So wie ich es verstanden habe, ist ist der Code so:


Code:
My.Computer.FileSystem.CopyDirectory("C:\User\XXXXX\.minecraft\saves", "C:\Users\Public", True)

aber jetzt stelle ich mir die Frage: wie bekomme ich den String 1 her? (Das Quellverzeichnis, also den .minecraft ordner). Wie kann ich das "Ergebnis" vom Ersten Code an dieser Stelle einfügen?
Und die dumme Frage: Was hat das "True" am schluss zu bedeuten? ^^
 
Zuletzt bearbeitet:
Und die dumme Frage: Was hat das "True" am schluss zu bedeuten? ^^
Steht direkt daneben ;)
Links auf der Seite sieht man die möglichen Methoden:
CopyDirectory-Methode (String, String, Boolean)
overwrite
Boolean. Gibt an, ob vorhandene Dateien überschrieben werden sollen. Der Standardwert ist False. Erforderlich.
aber jetzt stelle ich mir die Frage: wie bekomme ich den String 1 her?
String bauen:
Code:
Dim src_path as String = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "./minecraft")
Dim dest_path as String = "C:\Users\Public"
My.Computer.FileSystem.CopyDirectory(src_path, dest_path, True)
sowas in der Art.
Wobei man 1) irgendwo im VisualStudio einstellen können sollte, welche NET Version genutzt wird (4.5 muss hier nicht sein - 3.0 (Defaultversion in Winvista), 3.5 (Default Win7) oder gar 2.0 reichen vollkommen aus - sonst müssen das allerneuste NET Packet herunterlade + installieren + updaten, nur damit das Programm ausgeführt werden kann ;) )
2) falls das Programm nichts anderes als Kopieren macht, warum nicht gleich ein CMD Script mit "xcopy siehe oben" nutzen?
 
Jetzt bekomme ich einen Fehler:

"Declaration expected."

von der Zeile

Code:
My.Computer.FileSystem.CopyDirectory(src_path, dest_path, True)


Ich hab über "Public Class Form 1" folgendes reingeschrieben:

Code:
Imports Microsoft.VisualBasic.FileIO
Imports System.IO
 
Zuletzt bearbeitet:
*hust* warum vb?

und wann soll dein programm eigentlich laufen?

fragen über fragen ... abgesehen davon ... hatte ich gerade etwas langeweile ... evtl hilft dir das hier etwas weiter, oder auch nicht ... es ist c# ... vb halte ich für ne seuche ... viel spaß damit ...

Code:
using System.Linq;
using System.Management;
using System.Windows.Forms;

namespace ProcessTerminationEventHandling
{
    class Program
    {
        static void Main(string[] args)
        {
            EventQuery query = new EventQuery();
            query.QueryString = "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\"";
            ManagementEventWatcher watcher = new ManagementEventWatcher(query);
            watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            watcher.Start();
            Application.Run(new Form1());
            watcher.Stop();
        }

        static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
        {
            var tInst = e.NewEvent.GetPropertyValue("TargetInstance") as ManagementBaseObject;
            if (tInst.Properties.Cast<System.Management.PropertyData>().Any(x => x.Name == "CommandLine"))
            {
                var cmdline = tInst.GetPropertyValue("CommandLine") as string;
                if (cmdline.ToLower().Contains("minecraft")) 
                {//ein minecraft bezogener prozess ist gerade beendet worden ...
                    
                    //hier könnte man nun so dinge tun wie automatisch kopien von etwas zu machen ...

                }
            }
        }
    }
    public class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(59, 134);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(421, 13);
            this.label1.TabIndex = 0;
            this.label1.Text = "Ich bin ein Programm dass eine Operation auslößt wenn ein bestimmter Prozess endet ...";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(536, 281);
            this.Controls.Add(this.label1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
            this.Name = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Label label1;
    }
}
 
ja dann ist es so :D


Kann mir da trotzdem noch jeman bei diesem Problem helfen?
Jetzt bekomme ich einen Fehler:

"Declaration expected."

von der Zeile


Code:
My.Computer.FileSystem.CopyDirectory(src_path, dest_path, True)

Ich hab über "Public Class Form 1" folgendes reingeschrieben:


Code:
Imports Microsoft.VisualBasic.FileIO
Imports System.IO
 
Ich sehe in diesem Thread 3 Lösungen in 3 unterschiedlichen Sprachen und Umgebungen: Batch-Skript, VB.NET und C#. Wo liegt denn nun dein Problem?
 
dann schau mal meinen Beitrag vom 20.6. an ! Dann weißt du was mein Problem ist! C# kann ich gleich 2 mal nicht. Und batch will & kann ich auch ned (obwohl es recht einfach gehalten ist) da man am schluss das ganze verändern kann... usw.
 
Zuletzt bearbeitet:
Wenn du es nicht kannst, eigne das wissen an. Die Sprachen sind nicht sehr schwer um schnell mal was zusammen zu Scripten. Die Wartezeit bis dir hier jemand was vorgekautes und verdautes Serviert hättest du sinnvoller Nutzen können mit "lernen" der 3 Sprachen bzw lesen der Funktionsreferenzen.
 
Du kannst keine der Sprachen, denn sonst wüsstest du, wie man eine Datei kopiert und könntest die gegebenen Lösungsfragmente zusammensetzen. Gleichzeitig lehnst du aber alle Lösungen (c#, VB.NET, Batch) ab, die du nicht verstehst und wirkst gegenüber denen, die für dich Arbeit in eine potentielle Lösung gesteckt haben, ablehnend bis beleidigend. Jetzt stelle ich dir die einfache Frage: Glaubst du ernsthaft, dass jemand dir helfen möchte, wenn er oder sie damit rechnen muss, beleidigt zu werden, weil du die Lösung nicht verstehen willst?

Ich wiederhole mich gerne nochmal: Du hast hier 3 Lösungen, eine vierte wirst du wahrscheinlich nicht bekommen.
 
Du hast einen komplett funktionsfähigen C# code von GrafZahl bekommen (den man locker online durch nen C# -> VB Konverter schicken kann) und hast ihn abgelehnt. Jetzt brauchst du dich nicht wundern, warum dir niemand helfen will.

Um nicht nur rumzumeckern :wink::
Code:
Imports System.Linq
Imports System.Management
Imports System.Windows.Forms

Namespace ProcessTerminationEventHandling
	Class Program
		Private Shared Sub Main(args As String())
			Dim query As New EventQuery()
			query.QueryString = "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance isa ""Win32_Process"""
			Dim watcher As New ManagementEventWatcher(query)
			watcher.EventArrived += New EventArrivedEventHandler(AddressOf watcher_EventArrived)
			watcher.Start()
			Application.Run(New Form1())
			watcher.[Stop]()
		End Sub

		Private Shared Sub watcher_EventArrived(sender As Object, e As EventArrivedEventArgs)
			Dim tInst = TryCast(e.NewEvent.GetPropertyValue("TargetInstance"), ManagementBaseObject)
			If tInst.Properties.Cast(Of System.Management.PropertyData)().Any(Function(x) x.Name = "CommandLine") Then
				Dim cmdline = TryCast(tInst.GetPropertyValue("CommandLine"), String)
						'ein minecraft bezogener prozess ist gerade beendet worden ...
						'hier könnte man nun so dinge tun wie automatisch kopien von etwas zu machen ...

				If cmdline.ToLower().Contains("minecraft") Then
				End If
			End If
		End Sub
	End Class
	Public Class Form1
		Inherits Form
		Public Sub New()
			InitializeComponent()
		End Sub
		''' <summary>
		''' Required designer variable.
		''' </summary>
		Private components As System.ComponentModel.IContainer = Nothing

		''' <summary>
		''' Clean up any resources being used.
		''' </summary>
		''' <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
		Protected Overrides Sub Dispose(disposing As Boolean)
			If disposing AndAlso (components IsNot Nothing) Then
				components.Dispose()
			End If
			MyBase.Dispose(disposing)
		End Sub

		#Region "Windows Form Designer generated code"

		''' <summary>
		''' Required method for Designer support - do not modify
		''' the contents of this method with the code editor.
		''' </summary>
		Private Sub InitializeComponent()
			Me.label1 = New System.Windows.Forms.Label()
			Me.SuspendLayout()
			' 
			' label1
			' 
			Me.label1.AutoSize = True
			Me.label1.Location = New System.Drawing.Point(59, 134)
			Me.label1.Name = "label1"
			Me.label1.Size = New System.Drawing.Size(421, 13)
			Me.label1.TabIndex = 0
			Me.label1.Text = "Ich bin ein Programm dass eine Operation auslößt wenn ein bestimmter Prozess endet ..."
			' 
			' Form1
			' 
			Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
			Me.ClientSize = New System.Drawing.Size(536, 281)
			Me.Controls.Add(Me.label1)
			Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow
			Me.Name = "Form1"
			Me.ResumeLayout(False)
			Me.PerformLayout()

		End Sub

		#End Region

		Private label1 As System.Windows.Forms.Label
	End Class
End Namespace

Um den Code anständig formatiert zu bekommen:
1. Code in Visual Studio einfügen
2. Mit [STRG] + [A] alles auswählen
3. [STRG] + [K] drücken
4. [STRG] + [F] drücken
 
Zuletzt bearbeitet:
Zurück
Oben