سؤال

ولست بحاجة لوضع البيانات في الملف منذ بلدي وظيفة أخرى يأخذ ملف كإدخال.

وكيف أقوم بإنشاء اسم فريد في إرلانج؟

هل ما يشبه يونيكس "tempfile" الوجود؟

هل كانت مفيدة؟

المحلول

هل يعني مجرد توليد اسم الملف على acutal؟ في هذه الحالة الطريق الأسلم سيكون لاستخدام مزيج من الأرقام التي تحصل عليها من الآن () واسم المضيف من جهاز الكمبيوتر الخاص بك (إذا كان لديك العديد من العقد تفعل نفس الشيء).

وشيء من هذا القبيل:

1> {A,B,C}=now().
{1249,304278,322000}
2> N=node().
nonode@nohost
3> lists:flatten(io_lib:format("~p-~p.~p.~p",[N,A,B,C])).
"nonode@nohost-1249.304278.322000"
4> 

نصائح أخرى

ويمكنك أيضا استخدام TMP = lib:nonl(os:cmd("mktemp")).

وأو هل يمكن أن تفعل

وerlang:phash2(make_ref())

ولعيارة سريعة وسهلة فريدة من نوعها. فريدة من نوعها لمدة تصل إلى 2 ^ 82 المكالمات التي ينبغي أن تكون enough.for أغراضك. أجد هذا أسهل من تنسيق طابع زمني مع اسم عقدة للاستخدام.

والجواب المتأخر: أنا فقط لاحظت وحدة test_server الذي يحظى بدعم دليل الصفر، تستحق نظرة

http://www.erlang.org/doc/man /test_server.html#temp_name-1

ولقد كان أخيرا هذه المشكلة - والمستعمل بلدي باستخدام مزيج من أنظمة ويندوز ولينكس، لذلك حاول وصحيح القديم طريقة lib:nonl(os:cmd("mktemp")) هو عدم الذهاب الى قطع عليه بعد الآن

وحتى هنا هو كيفية لقد اتصلت به، سواء مع وظيفة mktemp/1 التي تقوم بإرجاع اسم الملف والتي يمكن استخدامها وأيضا وظيفة mktemp_dir/1 وترجع دليل (بعد خلق).

-spec mktemp(Prefix) -> Result
   when Prefix   :: string(),
        Result   :: {ok, TempFile  :: file:filename()}
                  | {error, Reason :: file:posix()}.

mktemp(Prefix) ->
    Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
    TempPath = filename:basedir(user_cache, Prefix),
    TempFile = filename:join(TempPath, Rand),
    Result1 = file:ensure_dir(TempFile),
    Result2 = file:write_file(TempFile, <<>>),
    case {Result1, Result2} of
         {ok, ok}    -> {ok, TempFile};
         {ok, Error} -> Error;
         {Error, _}  -> Error
    end.

والنسخة الدليل:

-spec mktemp_dir(Prefix) -> Result
   when Prefix  :: string(),
        Result  :: {ok, TempDir   :: file:filename()}
                 | {error, Reason :: file:posix()}.

mktemp_dir(Prefix) ->
    Rand = integer_to_list(binary:decode_unsigned(crypto:strong_rand_bytes(8)), 36),
    TempPath = filename:basedir(user_cache, Prefix),
    TempDir = filename:join(TempPath, Rand),
    Result1 = file:ensure_dir(TempDir),
    Result2 = file:make_dir(TempDir),
    case {Result1, Result2} of
         {ok, ok}    -> {ok, TempDir};
         {ok, Error} -> Error;
         {Error, _}  -> Error
    end.

وكلا هذين تفعل أساسا نفس الشيء: نحصل على اسم عشوائي بقوة نحو الثنائية، وتحويل ذلك إلى سلسلة base36، وإلحاقها إلى ما يعود OS لنا كموقع مخبأ مؤقت للمستخدم المحلي آمن <. / P>

في نظام يونيكس نوع، وبطبيعة الحال، فإننا يمكن أن تستخدم فقط filename:join(["/tmp", Prefix, Rand]) لكن عدم توافر /tmp على ويندوز هو نوع من بيت القصيد هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top