创建一个文本文件,并允许用户在一个灯开关应用程序中下载

本文关键字:一个 开关 用户 下载 应用程序 文件 文本 创建 许用户 | 更新日期: 2023-09-27 18:12:46

我想创建一个简单的文本文件在我的应用程序,并允许用户下载它。我有一个使用lightswitch构建的web应用程序。我已经用谷歌搜索过了,结果对我没有帮助,因为它与电灯开关有关。

在ASP中下载文本作为文件。净

这里,建议使用Response。然而,这个特定的命名空间在lightswitch中不可用。我尝试使用web客户端,我被拒绝访问。我的代码如下:

    using (System.Net.WebClient wc = new System.Net.WebClient()) {
        string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString() + "''" + Application.Current.User.FullName + ".txt";
        string text = "A class is the most powerful data type in C#. Like a structure, " + "a class defines the data and behavior of the data type. ";
        System.IO.File.WriteAllText(path, text);
        wc.DownloadFile(AppDomain.CurrentDomain.GetData("DataDirectory").ToString(), Application.Current.User.FullName + ".txt");
    }

我可以将我的文本文件写入APP_DATA。然而,当我尝试使用webclient下载它时,它给了我拒绝访问的权限。请帮帮我,谢谢。

创建一个文本文件,并允许用户在一个灯开关应用程序中下载

我在我的web应用程序中上传和下载Word文件。我遵循了两篇文章来帮助我实现这一目标:

如何导入和存储数据文件(本教程只讨论上传,但过程类似)
在Lightswitch 2011中上传和下载文件

在我的解决方案中,为了对称起见,上传和下载都遵循第一篇文章中的模式。我并不真正关心第二篇文章处理下载方面的方式。我不能确切地记得第二篇文章中提到的参考文献对我的做事方式是否必要。我在我的项目中有这些参考资料,但我知道我在其他事情上使用它们。至少在VS2013中,项目的卸载和重新加载是不必要的。

本质上,你需要创建一个自定义Silverlight控件来添加这个功能。因此,将.xaml文件添加到您的用户代码中。两篇文章都有应该在那里的例子,我的看起来像这样:

<controls:ChildWindow x:Class="LightSwitchApplication.DownloadFileWindow"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           Width="380" Height="125" 
           Title="Select Where to Save File" >
    <Grid x:Name="LayoutRoot" Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="25" HorizontalAlignment="Right" Margin="0,15,0,0" Grid.Row="1" />
        <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="25" HorizontalAlignment="Right" Margin="0,15,80,0" Grid.Row="1" />
        <Button Content="Browse" Height="25" HorizontalAlignment="Left" Margin="275,10,0,0" Name="BrowseButton" VerticalAlignment="Top" Width="75" Click="BrowseButton_Click" />
        <TextBox Height="25" HorizontalAlignment="Left" Margin="10,10,0,0" Name="FileTextBox" VerticalAlignment="Top" Width="250" IsEnabled="True"/>
    </Grid>
</controls:ChildWindow>

VS2013(我正在使用)和LightSwitch 2011(这是文章所写的)处理.xaml背后的代码不同。我不确定VS2012如何处理它,所以你需要弄清楚这部分。但是在自定义Silverlight控件背后的代码中,您需要一个构造函数,将OK和Cancel按钮的this.DialogResult分别设置为truefalse的函数,以及三个属性:

  1. DocumentStream作为MemoryStream类型写入您的计算机
  2. SaveFileStream作为FileStream类型从数据库中提取文件
  3. a FileName作为String类型

保存文件的实际工作发生在Browse按钮的代码中。

private void BrowseButton_Click(object sender, RoutedEventArgs e) {
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.Filter = "Word Files (*.docx)|*.docx|(*.docm)|*.docm";
    saveFileDialog.DefaultExt = "docx";
    if ((saveFileDialog.ShowDialog() == true)) {
        // Get File name, store and display to user
        this.FileTextBox.Text = saveFileDialog.FileName;
        this.m_FileName = saveFileDialog.FileName;
        this.FileTextBox.IsReadOnly = true;
        try {
            // Open and store the File Stream
            this.DocumentStream = saveFileDialog.OpenFile();
        }
        catch (IOException ex) {
            // Inform the user of the problem
            MessageBox.Show("The file you are trying to save to is open in another applicaion." + "'r'n" + "Please close it and try again.", "File Already Open", MessageBoxButton.OK);
        }
    }
}

我有FilterDefaultExt设置来处理Word文档,但你可以修改它来处理.txt或任何你想要的。根据我使用它的经验,我还添加了比文章中的示例更多的错误处理。

最后,在屏幕代码中,您需要调用Main调度程序上的自定义控件,并在自定义控件关闭时将文件写入数据库。

partial void DownloadFile_Execute()
{
    // To invoke our own dialog, we have to do this inside of the "Main" Dispatcher
    // And, since this is a web application, we can't directly invoke the Silverlight OpenFileDialog
    // class, we have to first invoke our own Silverlight custom control (i.e. DownloadFileWindow)
    // and that control will be able to invoke the OpenFileDialog class (via the Browse button)
    Dispatchers.Main.BeginInvoke(() =>
    {
        DownloadFileWindow downloadFileWindow = new DownloadFileWindow();
        downloadFileWindow.Closed += new EventHandler(downloadFileWindow_Closed);
        downloadFileWindow.Show();
    });
}
void downloadFileWindow_Closed(object sender, EventArgs e)
{
    // Invoked when our custom Silverlight window closes
    DownloadFileWindow downloadFile = (DownloadFileWindow)sender;
    try {
        // Continue if they hit the OK button AND they selected a file
        if ((downloadFile.DialogResult == true)) {
            // Write the document data stream from the database to the selected file
            using (Stream saveStream = new Stream(downloadFile.DocumentStream))
            {
                downloadFile.DocumentStream.WriteTo(saveStream);
            }
        }
        // Close and release the streams
        downloadFile.DocumentStream.Close();
        downloadFile.DocumentStream.Dispose();
        downloadFile.SaveFileStream.Close();
        downloadFile.SaveFileStream.Dispose();
    }
    catch (Exception ex) {
        string res = "One or more save location errors have occured:" + "'r'n";
        // Check to see if there is a Document Stream
        if ((downloadFile.DocumentStream == null)) {
            res = res + ''t' + "Document Stream is empty" + "'r'n";
        }
        // Check to see if there is a Save File Stream
        if ((downloadFile.SaveFileStream == null)) {
            res = res + ''t' + "Save File Stream is empty" + "'r'n";
        }
        // Check to see if there is a Safe File Name
        if ((downloadFile.SafeFileName == null)) {
            res = res + ''t' + "Safe File Name is empty" + "'r'n";
        }
        res = res + "'r'n" + "Please use the Browse button to select a location to save to. Specify a file name and then click Save.";
        this.ShowMessageBox(res, "Save Location Error", MessageBoxOption.Ok);
    }
}

可以看到,根据经验,我还为这些函数添加了更多的错误处理。希望通过这两篇文章和我的示例,您可以创建您想要的功能。

注意:我从VB转换的代码。. NET,这是我的项目是写在。因此,为了使c#的语法正确,您可能需要纠正一些错误