首页 文章

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

提问于
浏览
2

我有一个关于使用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时,我也找不到该目录 .

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

2 回答

  • 2

    没关系,我找到了解决方案 . 这是Windows手机的代码 . 2.您必须使用Windows IoT核心观察程序 . 右键单击您的设备并打开网络共享 . 之后我找到了文本文件:\ c $ \ Users \ DefaultAccount \ AppData \ Local \ Packages \ LocalState \ TextFilesFolder

  • 3

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

    我正在附加静态类文件,其中包含序列化和反序列化回原始对象的方法 .

    Download Source Code

    我们来看一个概括性的例子 . 假设您有Student和Mark课程,如下所示:

    /// <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]'以序列化它们,否则在序列化对象时它们将被忽略

    现在,为了序列化和反序列化,您将拥有以下带保存和加载功能的静态类:

    /// <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应用程序上运行 .

    Download Source Code

相关问题