-1

フォルダーとファイルを含む仮想フォルダーがある IIS を展開した Web サイトがあります。次のコードを使用して、Http サイトからファイルをコピーしています。ただし、一度に 1 つのファイルのみをコピーします。ファイルを1つずつコピーする代わりに、すべてのディレクトリをコピーしたい。

 private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
    {
        // Get the subdirectories for the specified directory.
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);
        DirectoryInfo[] dirs = dir.GetDirectories();

        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException(
                "Source directory does not exist or could not be found: "
                + sourceDirName);
        }

        // If the destination directory doesn't exist, create it. 
        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        // Get the files in the directory and copy them to the new location.
        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, false);
        }

        // If copying subdirectories, copy them and their contents to new location. 
        if (copySubDirs)
        {
            foreach (DirectoryInfo subdir in dirs)
            {
                string temppath = Path.Combine(destDirName, subdir.Name);
                DirectoryCopy(subdir.FullName, temppath, copySubDirs);
            }
        }
    }
4

3 に答える 3

0

ディレクトリのコピーは存在しません。新しい宛先ディレクトリを作成し、ソース ディレクトリ内のすべてのファイルをコピーします。ソース ディレクトリにディレクトリが含まれている場合は、そこにあるディレクトリごとにプロセスを無限に繰り返します。

ここでのコメントは、実際には別の問題を解決しようとしていることを示しています。その問題は何ですか?

実際の問題が との間でファイルが消えることである場合は、適切な句を適用して、もう存在しないファイルのエラーをキャッチします。dir.GetFiles()file.CopyTo()try..catch

実際の問題が との間にファイルが追加されることである場合、コピーしたファイルの名前のリストを保持し、すべてをコピーした後に再度呼び出し、結果を交差させて、新しいファイルが追加されたかどうかを確認します。dir.GetFiles()file.CopyTo()dir.GetFiles()

于 2013-10-04T07:53:51.003 に答える
0

FTP ディレクトリを使用して、特定のディレクトリ内のすべてのファイルをダウンロードする場合。

FTP ディレクトリからローカル フォルダにすべてのファイルをダウンロードできるようにするには、リモート ディレクトリ内のすべてのファイルを一覧表示してから、1 つずつダウンロードする必要があります。次のコードを使用して同じことを行うことができます。

    string[] files = GetFileList();
    foreach (string file in files)
    {
        Download(file);
    }

    public string[] GetFileList()
    {
        string[] downloadFiles;
        StringBuilder result = new StringBuilder();
        WebResponse response = null;
        StreamReader reader = null;
        try
        {
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            reqFTP.Proxy = null;
            reqFTP.KeepAlive = false;
            reqFTP.UsePassive = false;
            response = reqFTP.GetResponse();
            reader = new StreamReader(response.GetResponseStream());
            string line = reader.ReadLine();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
            }
            // to remove the trailing '\n'
            result.Remove(result.ToString().LastIndexOf('\n'), 1);
            return result.ToString().Split('\n');
        }
        catch (Exception ex)
        {
            if (reader != null)
            {
                reader.Close();
            }
            if (response != null)
            {
                response.Close();
            }                
            downloadFiles = null;
            return downloadFiles;
        }
    }

    private void Download(string file)
    {                       
        try
        {                
            string uri = "ftp://" + ftpServerIP + "/" + remoteDir + "/" + file;
            Uri serverUri = new Uri(uri);
            if (serverUri.Scheme != Uri.UriSchemeFtp)
            {
                return;
            }       
            FtpWebRequest reqFTP;                
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + remoteDir + "/" + file));                                
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);                
            reqFTP.KeepAlive = false;                
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;                                
            reqFTP.UseBinary = true;
            reqFTP.Proxy = null;                 
            reqFTP.UsePassive = false;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream responseStream = response.GetResponseStream();
            FileStream writeStream = new FileStream(localDestnDir + "\" + file, FileMode.Create);                
            int Length = 2048;
            Byte[] buffer = new Byte[Length];
            int bytesRead = responseStream.Read(buffer, 0, Length);               
            while (bytesRead > 0)
            {
                writeStream.Write(buffer, 0, bytesRead);
                bytesRead = responseStream.Read(buffer, 0, Length);
            }                
            writeStream.Close();
            response.Close(); 
        }
        catch (WebException wEx)
        {
            MessageBox.Show(wEx.Message, "Download Error");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Download Error");
        }
    }
于 2013-10-04T07:48:54.127 に答える
0

操作全体を非同期にすることもできますが、満足のいく結果が得られるかどうかはわかりません。一度にすべてをコピーできる関数は聞いたことがありません。どの OS にも、書き込み待ちのファイルのキューがあります ;)

操作に時間がかかりすぎる場合は、ajax を使用して現在の進行状況をユーザーに通知するだけで、通知なしで Web サイトがフリーズすることはありません。

于 2013-10-04T07:40:27.680 に答える