如何从任何地方(相对路径)读取文件

时间:2019-03-28 12:36:59

标签: c# xaml

我目前正在编写语言翻译应用程序。我希望支持选择文件的功能,将文件内容读入输入框,并在按下相应的按钮后输出翻译。

我正在使用插件'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 个答案:

答案 0 :(得分:2)

我猜您正在使用Xamarin?您不应有权访问文件本身。您可以获取名称,也可以获取内容。

您可以通过访问file.DataArray而不是使用传统的文件访问来获取文件的内容。因此,文件的实际路径是什么,与您无关。

答案 1 :(得分:1)

您正在将filePath设置为

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

应改为:

file.FilePath

,因为后者是文件的实际位置。

答案 2 :(得分:1)

CrossFilePicker返回对所选文件的完整路径引用。因此,您不必将其与任何其他路径组合。

请参阅project website中的示例 它准确显示了您尝试执行的操作-读取文件内容并将其输出。

    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的值放入控件来替换控制台输出。