Создайте текстовый файл и разрешите пользователю загружать его в приложении LightSwitch.

Я хотел бы создать простой текстовый файл в своем приложении и разрешить пользователю загружать его. У меня есть веб-приложение, созданное с использованием lightswitch. У меня уже есть Google, и ответы мне не помогают, поскольку это относится к выключателю света.

Загрузить текст в виде файла в ASP.NET

Здесь предлагается использовать Response. Однако это конкретное пространство имен недоступно для меня в lightswitch. Я попытался использовать веб-клиент, и мне было отказано в доступе. Мой код ниже.

    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 для его загрузки, мне было отказано в доступе. Помогите мне пожалуйста, спасибо.


person Maverick1415    schedule 14.07.2014    source источник


Ответы (1)


Я загружаю и скачиваю файлы 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 вам нужен конструктор, функции, которые устанавливают this.DialogResult в true и false для кнопок OK и Cancel соответственно, и три свойства:

  1. DocumentStream как тип MemoryStream для записи файла на ваш компьютер
  2. SaveFileStream как тип FileStream для извлечения файла из базы данных
  3. 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);
        }
    }
}

У меня есть Filter и DefaultExt для обработки документов 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#.

person embedded.kyle    schedule 15.07.2014