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を使用すると、ディレクトリも見つかりません。

多分誰かがアイデアを持っています。よろしくお願いします。

4

2 に答える 2

2

シリアル化は、テキスト ストレージよりも整理されたストレージに使用できます。

元のオブジェクトにシリアル化および逆シリアル化するメソッドを含む静的クラス ファイルを添付しています。

ソースコードをダウンロード

一般化した例を見てみましょう。以下のように 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] 'を属性にしてください。そうしないと、オブジェクトのシリアル化中に無視されます。


ここで、シリアル化および逆シリアル化するために、Save および 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();
        }
    }
}


それでは、 Student のオブジェクトを保存し、ファイルから取得する方法を見てみましょう。

/* 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 アプリで動作します。

ソースコードをダウンロード

于 2015-12-21T20:38:20.590 に答える