Подскажите пожалуйста, можно ли реализовать в переносимой библиотеки чтение файла? Возможно я что-то делаю не так, но в переносимой библиотеке не доступны такие класс как File, FileStream, невозможно создать экземпляр класса StreamReader или TextReader с помощью конструктора, которому передается в качестве параметра путь к файлу. При попытке написать вот такой код, ругается, что 'не удается преобразовать из "string" в "System.IO.Stream"'.
using System.IO;
namespace Project
{
class Class1
{
public Class1(string path)
{
StreamReader reader = new StreamReader(path);
}
}
}
Скорее всего, среди списка платформ вы выбрали в том числе Silverlight или что-то подобное. Silverlight - это плагин к браузеру, и ему запрещен доступ к локальным файлам; потому там и нет нужных вам классов.
В таком виде проблема решения не имеет; вам нужно выбирать одно из двух: или доступ к файлам, или экзотические платформы.
Создаем консольное приложение
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClassLibrary1;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Class1 cl = new Class1("d://test.txt");
}
}
}
Добавляем в "солютион" средствами VisualStudio новый проект - отдельный класс Class1
в виде dll.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ClassLibrary1
{
public class Class1
{
public Class1(string path)
{
StreamReader reader = new StreamReader(path);
string str = reader.ReadLine();
}
}
}
В менеджере проектов на у консольного проекта в разделе References добавляем ссылку на проект Class1
Компилируем solution, запускаем в отладчике - все работает
Вам необходимо будет в PLC проект добавить интерфейс.
Пример интерфейса:
public interface IFileWorker
{
Task<bool> ExistsAsync(string filename); // проверка существования файла
Task SaveTextAsync(string filename, string text); // сохранение текста в файл
Task<string> LoadTextAsync(string filename); // загрузка текста из файла
Task<IEnumerable<string>> GetFilesAsync(); // получение файлов из определнного каталога
Task DeleteAsync(string filename); // удаление файла
}
Далее для каждого из проектов (Android, iOS и т.д.) реализовать данный интерфейс.
Пример реализации для Andriod:
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Linq;
[assembly: Dependency(typeof(FileApp.Droid.FileWorker))]
namespace FileApp.Droid
{
public class FileWorker : IFileWorker
{
public Task DeleteAsync(string filename)
{
// удаляем файл
File.Delete(GetFilePath(filename));
return Task.FromResult(true);
}
public Task<bool> ExistsAsync(string filename)
{
// получаем путь к файлу
string filepath = GetFilePath(filename);
// существует ли файл
bool exists = File.Exists(filepath);
return Task<bool>.FromResult(exists);
}
public Task<IEnumerable<string>> GetFilesAsync()
{
// получаем все все файлы из папки
IEnumerable<string> filenames = from filepath in Directory.EnumerateFiles(GetDocsPath())
select Path.GetFileName(filepath);
return Task<IEnumerable<string>>.FromResult(filenames);
}
public async Task<string> LoadTextAsync(string filename)
{
string filepath = GetFilePath(filename);
using (StreamReader reader = File.OpenText(filepath))
{
return await reader.ReadToEndAsync();
}
}
public async Task SaveTextAsync(string filename, string text)
{
string filepath = GetFilePath(filename);
using (StreamWriter writer = File.CreateText(filepath))
{
await writer.WriteAsync(text);
}
}
// вспомогательный метод для построения пути к файлу
string GetFilePath(string filename)
{
return Path.Combine(GetDocsPath(), filename);
}
// получаем путь к папке MyDocuments
string GetDocsPath()
{
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
}
}
Для iOS проекта:
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Linq;
[assembly: Dependency(typeof(FileApp.iOS.FileWorker))]
namespace FileApp.iOS
{
public class FileWorker : IFileWorker
{
public Task DeleteAsync(string filename)
{
File.Delete(GetFilePath(filename));
return Task.FromResult(true);
}
public Task<bool> ExistsAsync(string filename)
{
string filepath = GetFilePath(filename);
bool exists = File.Exists(filepath);
return Task<bool>.FromResult(exists);
}
public Task<IEnumerable<string>> GetFilesAsync()
{
IEnumerable<string> filenames = from filepath in Directory.EnumerateFiles(GetDocsPath())
select Path.GetFileName(filepath);
return Task<IEnumerable<string>>.FromResult(filenames);
}
public async Task<string> LoadTextAsync(string filename)
{
string filepath = GetFilePath(filename);
using (StreamReader reader = File.OpenText(filepath))
{
return await reader.ReadToEndAsync();
}
}
public async Task SaveTextAsync(string filename, string text)
{
string filepath = GetFilePath(filename);
using (StreamWriter writer = File.CreateText(filepath))
{
await writer.WriteAsync(text);
}
}
string GetFilePath(string filename)
{
return Path.Combine(GetDocsPath(), filename);
}
string GetDocsPath()
{
return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}
}
}
Для вызова методов, определенных в интерфейсе, используется DependencyService
Например, чтобы прочитать из файла, в PLC проект достаточно добавить следующую строчку кода:
string Text = await DependencyService.Get<IFileWorker>().LoadTextAsync("Example.txt");
Материал взят от сюда
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как кинуть текущий год в содержимое тега? текущий год могу найти а как кинуть не получается
Разрабатываем операционную систему JsOSНужно написать драйвер для работы с ФС на USB носителе
Суть в том, чтобы при заполнении поля выводилось сообщение: всё ок, заполните поле, занято