Как читать в файле из любого места (относительный путь) - PullRequest
0 голосов
/ 28 марта 2019

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

Я использую плагин «Xam.Plugin.FilePicker», чтобы позволить пользователю выбрать файл, который работает. Когда пользователь выбирает файл, он у меня появляется, чтобы имя файла отображалось на экране. Однако возникают проблемы при попытке прочитать файл в поле ввода, которое, я считаю, связано с тем, что приложение не может определить путь к файлу - в настоящее время приложение пытается прочитать файл из того места, где Visual Studio 2017 находится.

Я пробовал несколько подходов, некоторые из которых подробно описаны ниже:

Я также пробовал:

var file = await CrossFilePicker.Current.PickFile();

if (file != null) {
    string filePath = 
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

    string filename = Path.Combine(filePath, file.FileName);

     using (var reader = new StreamReader(filename)) {
           entText= reader.ReadToEnd();

     }
}

Где entText - имя поля ввода в файле MainPage.xaml.cs

Ниже приведен код, который у меня есть. Я удалил приведенный выше код из файла и, в то время как он давал мне путь, путь был либо путем, в котором находится Visual Studio 2017, либо каким-либо другим путем. В любом случае, приложение не может найти файл.

C # код:

private async void BtnReadFile_Clicked(object sender, EventArgs e)
{
    string fileName;
    string fileText;
    string filePath;

    // Allows the user to choose a file from any location
    var file = await CrossFilePicker.Current.PickFile();

    if (file != null)
    {
        lblFileRead.Text = file.FileName; // Displays the name of the file
    }
}

Код Xaml:

  • Поле ввода:
<Entry x:Name="entText" Placeholder="Enter text to translate" Keyboard="Text" 
                   HeightRequest="200" WidthRequest="250" TextChanged="EntText_TextChanged" />
  • Кнопка для чтения в файле
<Button x:Name="btnReadFile" Text="Read in file" Clicked="BtnReadFile_Clicked" />

В заключение я хочу иметь возможность читать в файле из любого местоположения, а не только из заранее определенного местоположения, т.е.

Пользователь должен иметь возможность читать файлы из "C: / Documents / files", "C: / Downloads /" и т. Д.

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Я полагаю, вы используете Xamarin? Вы не должны иметь доступ к самому файлу. Вы можете получить имя, и вы можете получить содержимое.

Вы можете получить содержимое файла, обратившись к file.DataArray вместо традиционного доступа к файлу. Так что фактический путь файла - это не ваше дело.

1 голос
/ 28 марта 2019

CrossFilePicker возвращает ссылку на полный путь к выбранному файлу. Так что вам не нужно сочетать его с любым другим путем.

См. Пример с веб-сайта проекта Он показывает, что именно вы пытаетесь сделать - прочитать содержимое файла и вывести его.

    try
    {
        FileData fileData = await CrossFilePicker.Current.PickFile();
        if (fileData == null)
            return; // user canceled file picking

        string fileName = fileData.FileName;
        string contents = System.Text.Encoding.UTF8.GetString(fileData.DataArray);

        System.Console.WriteLine("File name chosen: " + fileName);
        System.Console.WriteLine("File data: " + contents);
    }
    catch (Exception ex)
    {
        System.Console.WriteLine("Exception choosing file: " + ex.ToString());
    }

Вам просто нужно заменить выход консоли, установив значение contents на ваше управление.

1 голос
/ 28 марта 2019

Вы устанавливаете filePath в

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

, когда вместо него должно быть:

file.FilePath

, поскольку последнее является фактическим местоположением файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...