65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 部署应用程序

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (10投票s)

2004 年 8 月 12 日

3分钟阅读

viewsIcon

103260

downloadIcon

1089

我如何创建了一个应用程序来帮助排除部署 DotNetNuke 站点所需的许多文件。

引言

我最近迷上了 DotNetNuke 框架,并创建了一些新的模块进行测试,但是当要上传应用程序时——如果我上传所有文件,它超过 60 MB。仅仅为了上传一堆不必要的文件,就要花费大量的时间和带宽,这实在太多了。我得到最好的建议是搜索(在副本中)并删除不需要的文件——每个文件都需要单独操作一遍。这行不通。

我确实找到了另一个应用程序,它可以完成此应用程序的功能,并额外提供压缩和 FTP 功能,但我只是想找一个只复制选定文件和现有文件夹结构到新文件夹的应用程序,我自己处理上传到服务器。

我的计划中唯一的问题是,我不确定完全支持 DNN 站点需要哪些类型的文件。所以我制作了这个应用程序,它可以扫描源文件夹中所有可能的文件扩展名,然后允许用户取消选中不应该上传的文件。

除了前面提到的那个之外,我没有看到其他任何应用程序可以做到这一点,所以我认为我可以将其发布到这里,供大家下载。

使用代码

这是一个非常小的应用程序——只有 7 个方法。让我们开始吧。

文件夹浏览

首先我需要一个FolderBrowser对话框(.net 1.0 中非常缺乏的东西)。请注意Description属性的使用。为用户提供一些可以在对话框上阅读的内容。

private void btnSource_Click(object sender, System.EventArgs e)
{
  folderBrowserDialog1.Description = 
    "Choose the Source Location to copy files from.";
  DialogResult result = folderBrowserDialog1.ShowDialog();
  if( result == DialogResult.OK )
  {
    tboxSource.Text = folderBrowserDialog1.SelectedPath;
  }
}
private void btnDestination_Click(object sender, System.EventArgs e)
{
  folderBrowserDialog1.Description = 
    "Choose the Destination Location to copy files to.";
  DialogResult result = folderBrowserDialog1.ShowDialog();
  if( result == DialogResult.OK )
  {
    tboxDestination.Text = folderBrowserDialog1.SelectedPath;
  }
}
    

我使用几个文本框来存储结果——或者允许用户直接输入。

文件夹检查

这个例程,给定源和目标DirectoryInfo对象,会遍历源中的子文件夹,并递归调用自身来重复此过程,如果正在复制站点,则制作所有文件夹及其子文件夹的副本,或者只允许CheckFiles方法扫描文件,但我有点超前了。

private void CheckDirectories(DirectoryInfo source, 
  DirectoryInfo destination, bool Deploy)
{
  foreach (DirectoryInfo tempdir in source.GetDirectories())
  {
    if (Deploy)
    {
      destination.CreateSubdirectory(tempdir.Name);
      tboxCopiedFiles.Text += "Creating Folder " + 
       destination.FullName + "\\" + tempdir.Name + "\r\n";
      progressBar1.Increment(1);
    }
    //
    DirectoryInfo tSource = new DirectoryInfo(
      source.FullName + "\\" + tempdir.Name);
    DirectoryInfo tDestin = new DirectoryInfo(
      destination.FullName + "\\" + tempdir.Name);
    CheckDirectories(tSource, tDestin, Deploy);
    folderCount++;
    CheckFiles(tSource, tDestin, Deploy);
  }
}
    

文件检查

下一部分加载lboxExtensions列表框或实际执行文件复制。这只是为目录中的每个项目创建一个FileInfo对象并解析扩展名或将其复制到目标的问题。

private void CheckFiles(DirectoryInfo source, 
   DirectoryInfo destination, bool Deploy)
{
  string extension = "";
  foreach (FileInfo tempfile in source.GetFiles())
  {
    extension = tempfile.Extension.ToLower();
    if (Deploy)
    {
      foreach (string item in lboxExtensions.CheckedItems)
      {
        if (item == extension)
        {
          tempfile.CopyTo(destination.FullName + "\\" + tempfile.Name, true);
          fileCount++;
          tboxCopiedFiles.Text += "Copying file " + tempfile.Name + "\r\n";
        }
      }
    }
    else
    {
      if (!lboxExtensions.Items.Contains(extension))
        lboxExtensions.Items.Add(extension, true);
    }
  }
}
    

注意

我将目录/文件检查方法重复用于扫描和复制。我传递布尔值mDeploy来控制它们的行为。

按钮点击

我可能可以将这些封装到一个EventHandler中,但我没有这样做。抱歉。快速应用开发的受害者。

这里的代码非常简单。只需调用一个方法来启动进程(接下来——终于!)以及处理ProgressBar

private void btnDeploy_Click(object sender, System.EventArgs e)
{
  progressBar1.Minimum = 0;
  progressBar1.Maximum = folderCount;
  this.StartProcessing(true);
  tboxCopiedFiles.Text += "Folders created: " +
    folderCount.ToString() + "\r\n";
  tboxCopiedFiles.Text += "Files copied: " + fileCount.ToString();
  progressBar1.Value = 0;
}

private void btnScan_Click(object sender, System.EventArgs e)
{
  this.StartProcessing(false);
  lboxExtensions.Sorted = true;
  this.btnDeploy.Enabled = true;
}
    

起点

我将这个例程放在迭代过程之外,作为启动扫描或部署的地方。它设置按钮启用状态并启动所有操作。它还允许在一个地方设置try/catch块。此方法接受布尔值mDeploy并将其传递给其他方法。

private void StartProcessing(bool mDeploy)
{
  this.btnDeploy.Enabled = false;
  this.btnScan.Enabled = false;
  tboxCopiedFiles.Text = "";
  try
  {
    DirectoryInfo srce = new DirectoryInfo(tboxSource.Text);
    DirectoryInfo dest = new DirectoryInfo(tboxDestination.Text);
    CheckDirectories(srce, dest, mDeploy);
    CheckFiles(srce, dest, mDeploy
  }
  catch (Exception ex)
  {
    MessageBox.Show("I/O Error", "Did you choose your folders?",
       MessageBoxButtons.OK);
  }
  if (this.lboxExtensions.Items.Count > 0)
    this.btnDeploy.Enabled = true;
  this.btnScan.Enabled = true;
}
    

关注点

总的来说,这是一个快速简单的项目。它允许我不上传不必要的文件——尽管我仍然想知道到底需要哪些文件。欢迎就该主题发送电子邮件。这很容易用于非网站发布目的,但这正是我需要的。

历史

  • 1.0 版完成:2004年8月9日
© . All rights reserved.