webForumDet fria alternativet

Kopiera katalog

.NET

2 svar · 318 visningar · startad av Aleph_One

Medlem sedan juni 2003372 inlägg
Frågan#1

Finns det nåt smidigt sätt att kopiera en katalog i C# ?

De lösningar som jag vet finns är att köra en rekursiv variant och kopiera varje fil för sig, sen finns ju också ManagementObject. Ingen av dom är helt smidiga... finns det nåt bättre sätt?

Medlem sedan aug. 2001458 inlägg
#2

Det borde gå att använda interop för att komma åt SHFileOperation, se http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=0cecc171-60df-489a-9703-7ce9b1d52a0f

Medlem sedan juni 2003372 inlägg
#3

developer skrev:

Det borde gå att använda interop för att komma åt SHFileOperation, se http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=0cecc171-60df-489a-9703-7ce9b1d52a0f

Verkar vara mer fipplande med det än med ManagementObject så jag kör på det istället.. tack för tipset iaf :)

using System;
using System.Management;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.IO;

class DirectoryOperations
{
	/// <summary>
	/// Copy a directory with all its content to another directory
	/// </summary>
	/// <param name="inputFolder">The directory to copy</param>
	/// <param name="outputFolder">The directory to be created (shall not exist before copying)</param>
	/// <returns>
	/// (found the different values by testing.. possibly incorrect/incomplete)
	///  0 - everything went ok
	///  9 - output folder same as input
	/// 10 - output folder already exists (will not overwrite)
	///</returns>
	public static int Copy(string inputFolder, string outputFolder)
	{
		string input = "'" + inputFolder + "'";
		string output = outputFolder;

		string path = "Win32_Directory.Name=" + input;

		ManagementObject mo = new ManagementObject(path);
		ManagementBaseObject inpar = mo.GetMethodParameters("Copy");
		inpar["FileName"] = output;
		ManagementBaseObject outpar = mo.InvokeMethod("Copy", inpar, null);

		int returnValue = Convert.ToInt32(outpar.Properties["ReturnValue"].Value);

		mo.Dispose();

		return returnValue;
	}

	public static void Main(string[] args)
	{
		int r = DirectoryOperations.Copy(@"c:\foo", @"c:\bar");

		Console.WriteLine ("return = "+r);
	}
}
250 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
117 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)