使用 Windows IoT 在 Raspberry PI 上保存文件
Saving files on Raspberry PI with Windows IoT
我对使用 Windows IoT 在 Raspberry PI 上保存文件有疑问。
我想做的事情:
我有各种要记录的值(温度)。对我来说最简单的方法是编写一个包含所有值的简单 txt 文件。
首先:是否可以在SD卡上本地创建文件?因为我找到的代码示例仅适用于 "normal" Windows 系统:
if (!File.Exists(path))
{
// Create a file to write to.
string createText = "Hello and Welcome" + Environment.NewLine;
File.WriteAllText(path, createText);
}
或 Windows Phone:
public void createdirectory()
{
IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
myIsolatedStorage.CreateDirectory("TextFilesFolder");
filename = "TextFilesFolder\Samplefile.txt";
Create_new_file();
}
public void Create_new_file()
{
IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
if (!myIsolatedStorage.FileExists(filename))
{
using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.Write, myIsolatedStorage)))
{
string someTextData = "This is a test!";
writeFile.WriteLine(someTextData);
// writeFile.Close();
}
}
Windows Phone 的代码对我来说更有意义。 (另一个根本不起作用)。但即使 phone 代码是正确的,我也不知道如何访问内部存储。我试过 IsolatedStorageExplorerTool,但它无法识别我的设备。可能是因为我的设备没有连接 USB... 而且它不是 phone。我用SSH也找不到目录。
也许有人有想法。预先感谢您的帮助!
没关系,我找到了解决方案。
1. 是 Windows phone 的代码。
2. 您必须使用 Windows IoT Core Watcher。右键单击您的设备并打开网络共享。之后我在以下位置找到了文本文件:
\\c$\Users\DefaultAccount\AppData\Local\Packages\\LocalState\TextFilesFolder
与文本存储相比,您可以使用序列化进行有组织的存储。
我正在附加静态 class 文件,其中包含序列化和反序列化回原始对象的方法。
举个概括的例子。假设,您有 Student 和 Mark class,如下所示:
/// <summary>
/// Provides structure for 'Student' entity
/// </summary>
/// 'DataContract' attribute is necessary to serialize object of following class. By removing 'DataContract' attribute, the following class 'Student' will no longer be serialized
[DataContract]
public class Student
{
[DataMember]
public ushort Id { get; set; }
[DataMember]
public string UserName { get; set; }
/// <summary>
/// Password has been marked as non-serializable by removing 'DataContract'
/// </summary>
// [DataMember] // Password will not be serialized. Uncomment this line to serialize password
public string Password { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public List<Mark> Marks { get; set; }
}
[DataContract]
public class Mark
{
[DataMember]
public string Subject { get; set; }
[DataMember]
public short Percentage { get; set; }
}
Make sure to attribute '[DataContract]' on calss and '[DataMember]' on data member to serialize them else they will be ignore while serializing object
现在,要序列化和反序列化,您将拥有以下具有保存和加载功能的静态 class:
/// <summary>
/// Provides functions to save and load single object as well as List of 'T' using serialization
/// </summary>
/// <typeparam name="T">Type parameter to be serialize</typeparam>
public static class SerializableStorage<T> where T : new()
{
public static async void Save(string FileName, T _Data)
{
MemoryStream _MemoryStream = new MemoryStream();
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Serializer.WriteObject(_MemoryStream, _Data);
Task.WaitAll();
StorageFile _File = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);
using (Stream fileStream = await _File.OpenStreamForWriteAsync())
{
_MemoryStream.Seek(0, SeekOrigin.Begin);
await _MemoryStream.CopyToAsync(fileStream);
await fileStream.FlushAsync();
fileStream.Dispose();
}
}
public static async Task<T> Load(string FileName)
{
StorageFolder _Folder = ApplicationData.Current.LocalFolder;
StorageFile _File;
T Result;
try
{
Task.WaitAll();
_File = await _Folder.GetFileAsync(FileName);
using (Stream stream = await _File.OpenStreamForReadAsync())
{
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Result = (T)Serializer.ReadObject(stream);
}
return Result;
}
catch (Exception ex)
{
return new T();
}
}
}
现在,让我们看看如何存储学生的对象并从文件中检索它:
/* Create an object of Student class to store */
Student s1 = new Student();
s1.Id = 1;
s1.UserName = "Student1";
s1.Password = "Student123";
s1.FirstName = "Abc";
s1.LastName = "Xyz";
s1.Marks = new List<Mark>();
/* Create list of Marks */
Mark m1 = new Mark();
m1.Subject = "Computer";
m1.Percentage = 89;
Mark m2 = new Mark();
m2.Subject = "Physics";
m2.Percentage = 92;
/* Add marks into Student object */
s1.Marks.Add(m1);
s1.Marks.Add(m2);
/* Store Student object 's1' into file 'MyFile1.dat' */
SerializableStorage<Student>.Save("MyFile1.dat", s1);
/* Load stored student object from 'MyFile1.dat' */
Student s2 = await SerializableStorage<Student>.Load("MyFile1.dat");
您可以序列化和反序列化任何 class。要存储 'Student' 以外的 class 的对象,假设 'MyClass',只需将函数的 'T' 参数中的 Student 类型替换为如下所示:
/* Store MyClass object 's1' into file 'MyFile1.dat' */
SerializableStorage<MyClass>.Save("MyFile1.dat", s1);
/* Load stored MyClass object from 'MyFile1.dat' */
MyClass s2 = await SerializableStorage<MyClass>.Load("MyFile1.dat");
NOTE: 'MyFile1.dat' will be stored in 'ApplicationData.Current.LocalFolder'. This code is tested on Windows 10 IoT Core (10.0.10586.0) and can work on any UWP app.
我对使用 Windows IoT 在 Raspberry PI 上保存文件有疑问。
我想做的事情: 我有各种要记录的值(温度)。对我来说最简单的方法是编写一个包含所有值的简单 txt 文件。
首先:是否可以在SD卡上本地创建文件?因为我找到的代码示例仅适用于 "normal" Windows 系统:
if (!File.Exists(path))
{
// Create a file to write to.
string createText = "Hello and Welcome" + Environment.NewLine;
File.WriteAllText(path, createText);
}
或 Windows Phone:
public void createdirectory()
{
IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
myIsolatedStorage.CreateDirectory("TextFilesFolder");
filename = "TextFilesFolder\Samplefile.txt";
Create_new_file();
}
public void Create_new_file()
{
IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
if (!myIsolatedStorage.FileExists(filename))
{
using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Create, FileAccess.Write, myIsolatedStorage)))
{
string someTextData = "This is a test!";
writeFile.WriteLine(someTextData);
// writeFile.Close();
}
}
Windows Phone 的代码对我来说更有意义。 (另一个根本不起作用)。但即使 phone 代码是正确的,我也不知道如何访问内部存储。我试过 IsolatedStorageExplorerTool,但它无法识别我的设备。可能是因为我的设备没有连接 USB... 而且它不是 phone。我用SSH也找不到目录。
也许有人有想法。预先感谢您的帮助!
没关系,我找到了解决方案。 1. 是 Windows phone 的代码。 2. 您必须使用 Windows IoT Core Watcher。右键单击您的设备并打开网络共享。之后我在以下位置找到了文本文件: \\c$\Users\DefaultAccount\AppData\Local\Packages\\LocalState\TextFilesFolder
与文本存储相比,您可以使用序列化进行有组织的存储。
我正在附加静态 class 文件,其中包含序列化和反序列化回原始对象的方法。
举个概括的例子。假设,您有 Student 和 Mark class,如下所示:
/// <summary>
/// Provides structure for 'Student' entity
/// </summary>
/// 'DataContract' attribute is necessary to serialize object of following class. By removing 'DataContract' attribute, the following class 'Student' will no longer be serialized
[DataContract]
public class Student
{
[DataMember]
public ushort Id { get; set; }
[DataMember]
public string UserName { get; set; }
/// <summary>
/// Password has been marked as non-serializable by removing 'DataContract'
/// </summary>
// [DataMember] // Password will not be serialized. Uncomment this line to serialize password
public string Password { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public List<Mark> Marks { get; set; }
}
[DataContract]
public class Mark
{
[DataMember]
public string Subject { get; set; }
[DataMember]
public short Percentage { get; set; }
}
Make sure to attribute '[DataContract]' on calss and '[DataMember]' on data member to serialize them else they will be ignore while serializing object
现在,要序列化和反序列化,您将拥有以下具有保存和加载功能的静态 class:
/// <summary>
/// Provides functions to save and load single object as well as List of 'T' using serialization
/// </summary>
/// <typeparam name="T">Type parameter to be serialize</typeparam>
public static class SerializableStorage<T> where T : new()
{
public static async void Save(string FileName, T _Data)
{
MemoryStream _MemoryStream = new MemoryStream();
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Serializer.WriteObject(_MemoryStream, _Data);
Task.WaitAll();
StorageFile _File = await ApplicationData.Current.LocalFolder.CreateFileAsync(FileName, CreationCollisionOption.ReplaceExisting);
using (Stream fileStream = await _File.OpenStreamForWriteAsync())
{
_MemoryStream.Seek(0, SeekOrigin.Begin);
await _MemoryStream.CopyToAsync(fileStream);
await fileStream.FlushAsync();
fileStream.Dispose();
}
}
public static async Task<T> Load(string FileName)
{
StorageFolder _Folder = ApplicationData.Current.LocalFolder;
StorageFile _File;
T Result;
try
{
Task.WaitAll();
_File = await _Folder.GetFileAsync(FileName);
using (Stream stream = await _File.OpenStreamForReadAsync())
{
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
Result = (T)Serializer.ReadObject(stream);
}
return Result;
}
catch (Exception ex)
{
return new T();
}
}
}
现在,让我们看看如何存储学生的对象并从文件中检索它:
/* Create an object of Student class to store */
Student s1 = new Student();
s1.Id = 1;
s1.UserName = "Student1";
s1.Password = "Student123";
s1.FirstName = "Abc";
s1.LastName = "Xyz";
s1.Marks = new List<Mark>();
/* Create list of Marks */
Mark m1 = new Mark();
m1.Subject = "Computer";
m1.Percentage = 89;
Mark m2 = new Mark();
m2.Subject = "Physics";
m2.Percentage = 92;
/* Add marks into Student object */
s1.Marks.Add(m1);
s1.Marks.Add(m2);
/* Store Student object 's1' into file 'MyFile1.dat' */
SerializableStorage<Student>.Save("MyFile1.dat", s1);
/* Load stored student object from 'MyFile1.dat' */
Student s2 = await SerializableStorage<Student>.Load("MyFile1.dat");
您可以序列化和反序列化任何 class。要存储 'Student' 以外的 class 的对象,假设 'MyClass',只需将函数的 'T' 参数中的 Student 类型替换为如下所示:
/* Store MyClass object 's1' into file 'MyFile1.dat' */
SerializableStorage<MyClass>.Save("MyFile1.dat", s1);
/* Load stored MyClass object from 'MyFile1.dat' */
MyClass s2 = await SerializableStorage<MyClass>.Load("MyFile1.dat");
NOTE: 'MyFile1.dat' will be stored in 'ApplicationData.Current.LocalFolder'. This code is tested on Windows 10 IoT Core (10.0.10586.0) and can work on any UWP app.