使用Windows IoT在Raspberry PI上保存文件

本文关键字:PI 保存文件 Raspberry Windows IoT 使用 | 更新日期: 2023-09-27 18:27:34

我有一个关于使用Windows IoT在Raspberry PI上保存文件的问题。

我想做的事:我有各种各样的数值(温度),我想记录下来。对我来说,最简单的方法是编写一个包含所有值的简单txt文件。

首先:是否有可能在SD卡上本地创建一个文件?因为我发现的代码样本只能在"正常"的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的代码对我来说更有意义。(另一个根本不起作用)。但即使电话代码是正确的,我也不知道如何访问内部存储。我尝试过IsolatedStorageExplorerTool,但它无法识别我的设备。可能是因为我的设备没有连接USB。。。而且它不是电话。当我使用SSH时,我也找不到目录。

也许有人有个主意。提前感谢您的帮助!

使用Windows IoT在Raspberry PI上保存文件

无论如何,我找到了解决方案。1.这是Windows手机的代码。2.您必须使用Windows物联网核心观察程序。右键单击您的设备并打开网络共享。之后,我在以下位置找到了文本文件:''''c$''Users''DefaultAccount''AppData''Local''Packages''''LocalState''TextFilesFolder

您可以将序列化用于有组织的存储,而不是文本存储。

我将静态类文件附加回原始对象,该文件包含要序列化和反序列化的方法。

下载源代码

让我们举一个概括的例子。假设你有学生和马克类,如下所示:

/// <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; }
}

确保calss上的属性"[DataContract]"和数据成员上的"[DataMember]"进行序列化,否则在序列化对象时将忽略它们


现在,要进行序列化和反序列化,您将拥有以下带有Save and Load函数的静态类:

/// <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");


您可以序列化和反序列化任何类。要存储"Student"以外的类的对象,假设为"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");

注意:"MyFile1.dat"将存储在"ApplicationData.Current.LocalFolder"中。此代码在Windows 10 IoT Core(10.0.10586.0)上进行了测试,可以在任何UWP应用程序上运行。

下载源代码